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

9 投票
4 回答
12015 浏览
提问于 2025-04-16 04:35

其实我现在在用 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 框架,比如 GeoDjangoMapFish:在 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 个回答

2

对于存储和提取非常大的数据立方体,HDF5存储效果很好(可以使用h5py或PyTables来在Python中操作)。你的应用程序可以在一台有HDF5数据库本地副本的机器上运行,或者可以搭建一个临时的服务器解决方案(同样是用Python)。

我在需要的时候设计了混合的SQL和HDF5存储策略,效果也相当不错。

如果你真的需要使用MDX查询语言,可以考虑以下几种方式:

  • 作为ORM使用(在StackOverflow上有早期的回答)

  • cubulus(不过只实现了MDX的一部分功能)

  • 将你选择的OLAP作为一个独立的服务器运行,并通过临时接口与它通信(甚至可以通过http使用XML)。

6

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

如果你能用py4j来访问olap4j,那就太好了。如果不行的话,可以考虑使用XMLA。它可能没有你想的那么慢(除非Python处理XML的速度很慢)。最大的问题是构建SOAP请求和理解响应的复杂性。

Julian

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服务器进行通信就可以了。

撰写回答