使用Python接口查询OLAP Mondrian(MDX,XMLA)?

时间:2010-09-25 09:25:13

标签: python mdx olap psycopg2 xmla

实际上我正在使用R + Python和RPY2来操作数据和ggplot来创建漂亮的图形..我在PostgreSQL数据库中有一些数据,而我正在使用psycopg2来查询数据。

我正在开始论文,将来我需要一个OLAP cube来存储我的(非常大的)模拟数据:多维度,聚合查询等。

在Python(我想要Python + R,没有jpivot或Java中的其他仪表板)和像Mondrian这样的OLAP引擎之间进行接口是否有任何最佳或标准的做法?我在Google上搜索了任何解决方案,但我没有找到任何解决方案。

我简要评估了SQLAlchemy和Django-ORM,但他们没有MDX或XML / A接口来查询OLAP服务器(Mondrian或其他)......

是否可以在MDX中编写查询,并使用psycopg + ODBC查询我的OLAP服务器,OLAP服务器从我的模拟数据中给出答案(没有Python对象的映射,但对我来说没问题)?

更新1:

为什么我需要搜索OLAP + Mondrian技术?

因为University of Laval(GeoSoa部门+ Thierry Badard)为OLAP写了一个空间扩展:SOLAP,并在蒙德里安实现了GeoMondrian。 我感兴趣的是因为我正在研究基于空间多代理的模拟(〜=地理模拟)。

GeoSoa部门创建了一个基于Ajax的组件,用于与GeoMondrian:SOLAPLAYERS进行通信和可视化空间数据,SOLAPLAYERS可以通过其Xlma servlet查询Mondrian服务器。

问题:大数据操作可能比较慢,需要Internet或Apache 2.简单来说,它只是可视化数据或映射...在我的情况下,我需要原始数据来制作我自己的数据操作+图形与R:spatial分析,回归分析,等级尾部等。在这里,SOLAP帮助我为后来复杂的R分析准备数据。

为何选择Python?

1 - 对空间数据的Web访问 -

我正在尝试使用“酷”的Python框架,例如GeoDjangoMapFish:GIS中的大社区,开源,使用GeoAlchemy来操纵空间查询/数据,包括使用JavaScript扩展和OpenLayers等的可视化。

2 - 在GIS中本地访问空间数据 -

我想在QGIS(开源GIS)中创建一个插件来访问和可视化数据,以及QGIS插件和API = Python。

3 - 自动分析数据 -

用户或科学家使用网格计算运行模拟,并选择他们想要对此数据运行的自动分析(R + ggplot2 + MDX查询)。我的目标是创建模拟的综合报告(图形,表格数据等)。

因此,在模拟之后,数据转到OLAP / SOLAP多维数据集,许多Python脚本(由用户创建)通过MDX获取数据,使用R + RPY2处理数据,并为doku上的科学家编写并生成很酷的输出维基或其他社区平台。

问题?

1 - 与外部组件通信的Mondrian的API核心Olap4j是Java制造的:/

2 - SOLAPLAYERS使用Ajax访问数据,对我来说太慢了。

3 - SQLAlchemy和GeoAlchemy没有与多维数据库(OLAP)的驱动程序连接。

*解决方案? *

1 - Py4j用Python访问olap4j中的Java对象或Java集合?编写我自己的函数来访问Java映射集合? =>危险而不是很容易?...

2 - XLMA与Ajax Mondrian服务器?这太慢了。

3 - 将我自己的py-connector写入OLAP Mondrian? =>哎哟。我认为这很难。

我该怎么办?

4 个答案:

答案 0 :(得分:6)

我不懂python,但我是mondrian / olap4j的作者。

如果你可以使用py4j访问olap4j,那太好了。如果没有,一定要考虑XMLA。它可能没有你想象的那么慢(除非python的XML解析很慢)。最大的问题是构建SOAP请求和理解响应的复杂性。

儒略

答案 1 :(得分:5)

如您所知,Mondrian是一个完整的OLAP引擎,用java编写,就像MySQL一样。因此,如果我理解你的问题,你想使用Mondrian并想知道如何将它与Python接口。

我使用包装在.jar中的Mondrian来在命令行上处理MDX查询并发送回JSON。 Python直接在命令行中调用它。

import commands
result = commands.getoutput('java -jar Mondrian_cli.jar -q 
select NON EMPTY Crossjoin({[Measures].[Store Sales]}, 
Crossjoin([Time].[1997].Children, [Store].[All Stores].Children)) ON COLUMNS, 
[Product].[All Products].Children ON ROWS from [Sales]') 

对于服务器使用,我将其打包在servlet中,然后使用ajax发送MDX。 ajax调用不是一个很大的开销,这就是为什么我不认为需要耦合Python和Java而不仅仅是与Mondrian服务器进行通信。

答案 2 :(得分:2)

对于非常大的数据立方体存储和检索,HDF5存储工作相当好(用于Python接口的h5py或PyTables)。然后,您的应用程序可以在具有HDF5数据库本地副本的计算机上运行,​​也可以创建一个ad-hoc服务器解决方案(仍在Python中)。

我一直在设计混合SQL / HDF5存储策略,并且表现相当不错。

如果确实需要MDX查询语言:

  • as an ORM(有关stackoverflow的早期答案)

  • cubulus(虽然只实施了MDX的一部分)

  • 将您选择的OLAP作为单独的服务器运行,并通过ad-hoc接口与其进行通信(甚至可能是通过http的XML)。

答案 3 :(得分:1)

为了完成一点,我刚刚发现这个python包来访问XMLA服务器:www。它说它与Mondrian,icCube,MSAS合作。