用Python接口查询OLAP Mondrian(MDX, XMLA)?
其实我现在在用 R 和 Python,利用 RPY2 来处理数据,还用 ggplot 来制作漂亮的图表。我有一些数据存储在 PostgreSQL 数据库里,正在用 psycopg2 来查询这些数据。
我正在开始写论文,未来我需要一个 OLAP 立方体 来存储我(非常大的)模拟数据:包括多个维度、聚合查询等等。
有没有什么好的或者标准的方法,可以让 Python(我想用 Python 和 R,不想用 jpivot 或其他 Java 的仪表板)和像 Mondrian 这样的 OLAP 引擎进行连接?我在谷歌上搜索过,但没有找到任何解决方案。
我简单评估过 SQLAlchemy 和 Django-ORM,但它们没有 MDX 或 XML/A 接口来查询 OLAP 服务器(Mondrian 或其他)……
我能不能用 MDX 写一个查询,然后通过 psycopg + ODBC 来查询我的 OLAP 服务器,让 OLAP 服务器给我返回我的模拟数据的结果(不需要映射到 Python 对象,这对我来说没问题)?
更新 1:
我为什么需要研究 OLAP + Mondrian 技术?
因为 拉瓦尔大学(GeoSoa 系所 + Thierry Badard)为 OLAP 写了一个空间扩展:SOLAP,并在 Mondrian 中实现了 GeoMondrian。这让我很感兴趣,因为我正在做空间多智能体模拟(类似于地理模拟)。
GeoSoa 系所创建了一个基于 Ajax 的组件,用于与 GeoMondrian 通信和可视化空间数据:SOLAPLAYERS,可以通过它的 Xlma servlet 查询 Mondrian 服务器。
问题是:在处理大数据时可能会很慢,需要互联网或 Apache 2。简单来说,它只是用来可视化数据或地图……在我这里,我需要原始数据来进行自己的数据处理和用 R 制作图表:空间分析、回归分析、秩尾分析等等。在这里,SOLAP 可以帮助我准备数据,以便后续进行复杂的 R 分析。
为什么选择 Python?
1 - 访问空间数据的网络方式 -
我想用一个“酷”的 Python 框架,比如 GeoDjango 或 MapFish:在 GIS 领域有很大的社区,开源,使用 GeoAlchemy 来处理空间查询/数据,包括用 JavaScript 扩展进行可视化和 OpenLayers 等等。
2 - 在 GIS 中本地访问空间数据 -
我想在 QGIS(开源 GIS)中创建一个插件来访问和可视化数据,而 QGIS 的插件和 API 是用 Python 写的。
3 - 数据的自动分析 -
用户或科学家运行一个模拟,使用网格计算,并选择他们想要在这些数据上运行的自动分析(R + ggplot2 + MDX 查询)。我在这里的目标是创建一个模拟的综合报告(图形、表格数据等等)。
所以,在模拟之后,数据会进入 OLAP/SOLAP 立方体,许多 Python 脚本(由用户创建)会用 MDX 获取数据,利用 R + RPY2 处理数据,并为科学家在 doku-wiki 或其他社区平台上写出和生成很酷的输出。
问题?
1 - Olap4j,Mondrian 的核心 API,用于与外部组件通信,是用 Java 写的 :/
2 - SOLAPLAYERS 使用 Ajax 访问数据,对我来说太慢了。
3 - SQLAlchemy 和 GeoAlchemy 没有连接到多维数据库(OLAP)的驱动。
* 解决方案? *
1 - 用 Py4j 访问 olap4j 中的 Java 对象或 Java 集合?自己写一个函数来访问 Java 映射的集合? => 这很危险,也不太容易?...
2 - 用 Ajax 查询 XLMA Mondrian 服务器?这太慢了。
3 - 自己写一个 py-connector 连接 OLAP Mondrian? => 哎呀。这条路我觉得很难。
我该怎么办?
4 个回答
我不懂Python,但我是mondrian/olap4j的作者。
如果你能用py4j来访问olap4j,那就太好了。如果不行的话,可以考虑使用XMLA。它可能没有你想的那么慢(除非Python处理XML的速度很慢)。最大的问题是构建SOAP请求和理解响应的复杂性。
Julian
你知道,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服务器进行通信就可以了。