Вопрос

Я новичок в MDX / OLAP и мне интересно, есть ли какой-нибудь ORM, подобный Django ORM для Python, который бы поддерживал OLAP.

Я разработчик на Python / Django, и если что-то будет иметь какой-то уровень интеграции с Django, мне будет очень интересно узнать об этом больше.

Это было полезно?

Решение

В Django есть некоторые функции OLAP, которые близки к выпуску.

Прочитайте http://www.eflorenzano.com/blog/post / секреты-Джанго-ОРМ /

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.

Другие советы

То же самое, что и kpw , я пишу свои собственные вещи, за исключением того, что это исключительно для Django:

https://code.google.com/p/django-cube/

У меня была похожая потребность - не для полноценного ORM, а для простого OLAP-подобного хранилища данных в Python. После тщательного поиска существующих инструментов я написал этот небольшой взлом:

https://github.com/kpwebb/python -куба / блоб / ведущий / SRC / cube.py

Даже если это не решит вашу конкретную задачу, это может быть хорошей отправной точкой для написания чего-то более сложного.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top