Какие-нибудь движки Python OLAP/MDX ORM?
Я новичок в MDX/OLAP, и мне интересно, есть ли какой-либо ORM, похожий на Django ORM для Python, который бы поддерживал OLAP.
Я разработчик Python/Django, и если что-то будет иметь какой-то уровень интеграции с Django, мне будет очень интересно узнать об этом больше.
4 ответа
У 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
Чтобы вычислить несколько СУММ и СЧЕТОВ, а что нет, вы должны сделать что-то вроде этого.
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 /group_by. Зачем? Вы используете простое сопоставление, а не более сложную операцию группировки на основе сортировки, которую СУБД часто приходится использовать для этого. Да, вы получаете много строк; но вы делаете меньше, чтобы получить их.
Это имеет тот недостаток, что это не так декларативно, как хотелось бы. Преимущество в том, что это чистый Django ORM.
Также есть http://cubes.databrewery.org/. Легкий движок OLAP на питоне.
То же самое, что и kpw, я пишу свои собственные вещи, за исключением того, что это исключительно для Django:
У меня была похожая потребность - не для полноценного ORM, а для простого OLAP-подобного хранилища данных в Python. После тщательного поиска существующих инструментов я написал этот небольшой взлом:
https://github.com/kpwebb/python-cube/blob/master/src/cube.py
Даже если это не решит вашу конкретную задачу, это может быть хорошей отправной точкой для написания чего-то более сложного.