2009-01-22 26 views
7

Soy nuevo en el MDX/OLAP y me pregunto si hay algún ORM similar a Django ORM para Python que admita OLAP.Cualquier motor Python OLAP/MDX ORM?

Soy un desarrollador de Python/Django y si hubiera algo que tuviera algún nivel de integración con Django, estaría muy interesado en aprender más sobre él.

Respuesta

6

Django tiene algunas características OLAP que están a punto de publicarse.

Leer http://www.eflorenzano.com/blog/post/secrets-django-orm/

http://doughellmann.com/2007/12/30/using-raw-sql-in-django.html, también

Si usted tiene un diseño adecuado esquema en estrella, en primer lugar, a continuación, los resultados de una dimensión pueden tener la siguiente forma.

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 

Si desea crear un resumen bidimensional, debe hacer algo como lo siguiente.

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 

Para calcular múltiples SUM's y COUNT's y lo que no, tienes que hacer algo como esto.

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 

Esto - a primera vista - parece ineficaz. Estás revisando la tabla de hechos y devolviendo muchas filas que luego agregas en tu aplicación.

En algunos casos, esto puede ser más rápido que la suma/grupo_by nativa del RDBMS. ¿Por qué? Está utilizando un mapeo simple, no la operación de agrupamiento por orden más compleja que el RDBMS a menudo tiene que usar para esto. Sí, estás recibiendo muchas filas; pero estás haciendo menos para obtenerlos.

Esto tiene la desventaja de que no es tan declarativo como nos gustaría. Tiene la ventaja de que es puro Django ORM.

+0

Me pregunto cómo se actualizaría esto para aprovechar el reciente soporte incluido de Djangos a múltiples bases de datos: http://docs.djangoproject.com/en/dev/topics/db/multi-db/ – fccoelho

0

Tenía una necesidad similar, no para un ORM completo, sino para una simple tienda de datos OLAP en Python. Después viene la búsqueda seco para disfrutar de herramientas existentes que escribí este pequeño truco:

https://github.com/kpwebb/python-cube/blob/master/src/cube.py

Incluso si no resuelve su necesidad exacta, podría ser un buen lugar de partida para escribir algo más sofisticado.

Cuestiones relacionadas