使用 Python 查询 SQL Server Analysis Services (SSAS) 多维数据集数据

Posted

技术标签:

【中文标题】使用 Python 查询 SQL Server Analysis Services (SSAS) 多维数据集数据【英文标题】:Use Python to Query SQL Server Analysis Services (SSAS) cube Data 【发布时间】:2019-10-10 05:48:16 【问题描述】:

我的组织有一个SQL分析服务资源,我们可以使用excel或者powerbi连接cube使用服务器名(tooldata.amr.xxx.com)获取数据。

我想要的是使用 python 或 excel 自动执行数据查询并输出到 csv 文件以供下游应用程序使用(报告/图表等)

我在下面尝试过但失败了:

1.Microsoft.AnalysisServices.AdomdClient

FileNotFoundException Traceback(最近一次调用最后一次) 在

2. clr.AddReference ("Microsoft.AnalysisServices.AdomdClient.dll")

FileNotFoundException:无法找到程序集“Microsoft.AnalysisServices.AdomdClient.dll”。 在 Python.Runtime.CLRModule.AddReference(字符串名称)

看起来缺少一些环境。不知道如何进行。有什么建议吗?

2.use olap.xmla

import olap.xmla.xmla as xmla 
provider = olap.xmla.xmla.XMLAProvider()
connect = provider.connect(location='http://tooldata.amr.xxx.com/OLAP/msmdpump.dll',username='user',password='pwd')
source = connect.getOLAPSource()
print (source.getCatalog("TestCube"))

ConnectionError: HTTPConnectionPool(host='tooldata.amr.xxx.com', port=80): Max retries exceeded with url: /OLAP/msmdpump.dll (由 NewConnectionError(': 无法建立新连接: [WinError 10060] 连接尝试失败,因为连接方在一段时间后没有正确响应,或者连接失败,因为连接的主机没有响应'))

看起来需要从服务器端进行一些配置,但我无法控制,请放弃此选项。

3.既然我可以使用excel来获取SSAS数据,那是否可以使用python调用excel并刷新数据,然后从excel中解析出数据?有人试试吗?

谢谢。

【问题讨论】:

尝试 1) 将 .dll 的位置附加到 sys.path;或 2) 使用完整路径,例如clr.AddReference (r"D:\dlls\Microsoft.AnalysisServices.AdomdClient.dll") 感谢 Owl7,在我添加完整路径后它现在可以工作了 【参考方案1】:

最后基于1.Microsoft.AnalysisServices.AdomdClient解决方案解决了问题。

#use your own DLL path.
clr.AddReference ("r"C:\Windows\assembly\GAC_MSIL\Microsoft.AnalysisServices.AdomdClient\11.0.0.0__89845dcd8080cc91\Microsoft.AnalysisServices.AdomdClient.dll"")
clr.AddReference ("System.Data")
from Microsoft.AnalysisServices.AdomdClient import AdomdConnection , AdomdDataAdapter
from System.Data import DataSet
#use your own server name or address. and data cube name.
conn = AdomdConnection("Data Source=tooldata.amr.xxx.com;Catalog=ShiftlyCellCube;")
conn.Open()
cmd = conn.CreateCommand()
#your MDX query, if you are not familiar, you can use the excel powerpivot to build one query for you. 
cmd.CommandText = "your mdx query" 
adp = AdomdDataAdapter(cmd)
datasetParam =  DataSet()
adp.Fill(datasetParam)
conn.Close();

# datasetParam hold your result as collection a\of tables
# each tables has rows
# and each row has columns
print (datasetParam.Tables[0].Rows[0][0])

clr 是 pythonnet,你可以通过:pythonnet Github 或pythonnet pypi 安装包

对于 Microsoft.AnalysisServices.AdomdClient.dll,您可能没有它。你可以通过安装SQL_AS_ADOMD.msi 来获取DLL。

最后,旨在从 Cube DataSet 中解析结构化数据集。我使用以下代码(字段取决于您的 DAX 查询输出)。

with open ('xx_Pivot.csv','w') as file:
#my MDX only return 7 field as below headers.
header = 'WW,Shift,ShiftID,Factory,Entity,Cell,Data\n'
file.writelines(header)
#iteration the Dataset and get out a structure 2D data table and save to a file.
for row_n in range(len(list(datasetParam.Tables[0].Rows))):
    row = ''
    for column_n in range(7):
        data = datasetParam.Tables[0].Rows[row_n][column_n]
        row = row+str(data)+',' 
    row = row+'\n'
    file.writelines(row)

【讨论】:

以上是关于使用 Python 查询 SQL Server Analysis Services (SSAS) 多维数据集数据的主要内容,如果未能解决你的问题,请参考以下文章

如何在 python 中使用 sqlalchemy 在查询中创建 sql server 表变量

来自 Python 的复杂 SQL Server 查询

sql server inject使用动态查询执行sql语句实例

使用 python pymssql 调用 sql server 存储过程

在SQL Server中为什么不建议使用Not In子查询

Python:将大型 SQL Server 查询结果导出到 .txt 文件