【发布时间】:2010-10-02 22:08:48
【问题描述】:
我是 MDX/OLAP 的新手,我想知道是否有任何类似于 Django ORM for Python 的 ORM 支持 OLAP。
我是一名 Python/Django 开发人员,如果有一些东西可以与 Django 进行某种程度的集成,我会非常有兴趣了解更多相关信息。
【问题讨论】:
标签: python django orm olap mdx
我是 MDX/OLAP 的新手,我想知道是否有任何类似于 Django ORM for Python 的 ORM 支持 OLAP。
我是一名 Python/Django 开发人员,如果有一些东西可以与 Django 进行某种程度的集成,我会非常有兴趣了解更多相关信息。
【问题讨论】:
标签: python django orm olap mdx
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。
【讨论】:
我也有类似的需求——不是完整的 ORM,而是 Python 中一个简单的类似 OLAP 的数据存储。在干搜索现有工具后,我写了这个小技巧:
https://github.com/kpwebb/python-cube/blob/master/src/cube.py
即使它不能解决您的确切需求,它也可能是编写更复杂的东西的良好起点。
【讨论】:
和kpw一样,我自己写的东西,只是它是专门为Django写的:
【讨论】:
还有http://cubes.databrewery.org/。 python中的轻量级OLAP引擎。
【讨论】: