我是 MDX/OLAP 的新手,我想知道是否有任何类似于 Django ORM for Python 的 ORM 可以支持 OLAP。
我是一名 Python/Django 开发人员,如果有一些东西可以与 Django 进行某种程度的集成,我会非常有兴趣了解更多关于它的信息。
Django 有一些即将发布的 OLAP 功能。
阅读http://www.eflorenzano.com/blog/post/secrets-django-orm/
http://doughellmann.com/2007/12/30/using-raw-sql-in-django.html,也
如果您首先有适当的星型模式设计,那么一维结果可以具有以下形式。
from myapp.models import SomeFact
from collections import defaultdict
facts = SomeFact.objects.filter( dimension1__attribute=this, dimension2__attribute=that )
myAggregates = defaultdict( int )
for row in facts:
myAggregates[row.dimension3__attribute] += row.someMeasure
如果要创建二维摘要,则必须执行以下操作。
facts = SomeFact.objects.filter( dimension1__attribute=this, dimension2__attribute=that )
myAggregates = defaultdict( int )
for row in facts:
key = ( row.dimension3__attribute, row.dimension4__attribute )
myAggregates[key] += row.someMeasure
要计算多个 SUM 和 COUNT 等等,你必须做这样的事情。
class MyAgg( object ):
def __init__( self ):
self.count = 0
self.thisSum= 0
self.thatSum= 0
myAggregates= defaultdict( MyAgg )
for row in facts:
myAggregates[row.dimension3__attr].count += 1
myAggregates[row.dimension3__attr].thisSum += row.this
myAggregates[row.dimension3__attr].thatSum += row.that
这——乍一看——似乎效率低下。您正在浏览返回大量行的事实表,然后您将这些行汇总到您的应用程序中。
在某些情况下,这可能比 RDBMS 的本机 sum/group_by更快。为什么?您使用的是简单的映射,而不是 RDBMS 经常为此使用的更复杂的基于排序的分组操作。是的,你得到了很多行;但你在得到它们方面做得更少。
这样做的缺点是它不像我们想要的那样具有声明性。它的优点是它是纯 Django ORM。
和kpw 一样,我自己写东西,除了它是专门为 Django 写的:
还有http://cubes.databrewery.org/。python中的轻量级OLAP引擎。
我也有类似的需求——不是完整的 ORM,而是 Python 中一个简单的类似 OLAP 的数据存储。在对现有工具进行干搜索后,我写了这个小技巧:
https://github.com/kpwebb/python-cube/blob/master/src/cube.py
即使它不能解决您的确切需求,它也可能是编写更复杂的东西的良好起点。