在本博客中,我们将了解如何使用从 SSAS 表格、Power BI Desktop 或 Power BI 服务数据集中提取的 Model.bim 文件在本地或 PBI 服务上生成新数据集。
1、设置(SSAS 表格和 PBI 服务通用)
我建议你创建一个专门用于此任务的新 Python 环境,因为它使用的库与另一个库发生冲突。
要创建虚拟环境,只需在特定文件夹中打开终端或 PowerShell 窗口并运行命令:
python -m venv pbi_env
完成此操作后,你需要激活环境 .\pbi_env\Scripts\activate 并安装 pythonnet 库,该库允许我们使用 .net Dlls。
如果你没有创建新的虚拟环境并且已经有 Clr 库,那么首先需要卸载它,然后安装 Pythonnet,否则你将收到运行时错误。
要在选择 IDE 时引用此环境,只需使用位于 C:\Users\antsharma\Downloads\Blog\pbi_env\Scripts\python.exe
的 python.exe 文件的路径
在 VS Code 中,你可以使用底部窗格中的选项设置 interperter:
只需输入python.exe的路径即可:
完成后,我们需要引用 2 个 DLL: Microsoft.AnalysisServices.Tabular
和 Microsoft.AnalysisServices
。
如果已经安装了 PBI Desktop 或 SSAS,那么你将在文件夹中找到它们: C:\Windows\Microsoft.NET\ assembly\GAC_MSIL
这是导入这些库的方式:
导入 Json 是因为 Model.bim 文件存储为 JSON 结构。
两者共同的下一部分是启动服务器、提供连接字符串并进行连接。
server.Databases.GetNewName
确保你不会用相同名称覆盖现有模型并每次创建一个新模型。 密码是你的 Windows 凭据。
2、创建 SSAS 表格数据库
因此,从这一点开始,事情将略有不同,因为 PBI Desktop 和 PBI Service 的 model.bim 与 SSAS Tabular 的 model.bim 不同,因为兼容性级别和默认 PowerBIDataSourceVersion 不同,因此你不能只将一个用于你需要的另一个 在部署之前编辑 model.bim 文件,稍后我将向你展示。
接下来我们需要 model.bim,现在它可以是你已经拥有的东西,也可以是你想要从现有数据库中提取的东西,使用表格编辑器提取现有数据库的 model.bim 文件,打开 TE 并连接到任何现有模型 并选择另存为并将文件保存在某处
创建一个新变量:
bim_file = r"C:\ Users \ antsharma \ OneDrive \ Desktop \ Contoso Import.bim"
接下来我们将使用之前导入的json库打开这个bim文件:
我打开该文件并用新名称替换了 id 和名称,以便每次运行代码时都会创建一个新数据库。
现在的问题是,如果我们使用 Python 读取 JSON,JSON 结构将被转换为表格模型脚本语言不支持的等效 Python 结构,因此我们需要将其转换回原始格式以及反序列化数据库以将 JSON 字符串到对象,之后我们需要做的就是生成 TMSL 脚本并执行它。
SSAS表格版本的完整代码:
import json
import clr
folder = r"C:\Windows\Microsoft.NET\assembly\GAC_MSIL"
clr.AddReference(folder + r"\Microsoft.AnalysisServices.Tabular\v4.0_15.0.0.0__89845dcd8080cc91\Microsoft.AnalysisServices.Tabular.DLL")
clr.AddReference(folder + r"\Microsoft.AnalysisServices\v4.0_15.0.0.0__89845dcd8080cc91\Microsoft.AnalysisServices.DLL")
import Microsoft.AnalysisServices as AS
import Microsoft.AnalysisServices.Tabular as Tabular
workspace = "domain\servername"
username = 'domain\username'
password = '*****************'
conn_string = f"DataSource={workspace};User ID={username};Password={password};"
server = Tabular.Server()
server.Connect(conn_string)
new_dataset_name = server.Databases.GetNewName('SSAS Tabular Model w Python')
bim_file = r"C:\Users\antsharma\OneDrive\Desktop\Contoso Import.bim"
with open(bim_file) as bim:
json_file = json.load(bim)
json_file['id'] = new_dataset_name
json_file['name'] = new_dataset_name
raw_json = json.dumps(json_file, indent=4)
db = AS.JsonSerializer.DeserializeDatabase(
raw_json,
DeserializeOptions = 'default',
CompatibilityMode = 'Analysis Services'
)
# Compatibility Modes:
# Analysis Services = 1 (Basic AnalysisServices mode - used on SSAS and AAS)
# Excel PowerPivot = 4
# PowerBI = 2
# Unknown = 0
script = Tabular.JsonScripter.ScriptCreateOrReplace(db)
server.Execute(script)
server.Disconnect()
如果转到服务器,你将看到新数据库已创建,我们已将 Contoso Import 复制到另一个数据库。
现在你只需要处理它。
3、创建 Power BI 数据集
我们只需对代码进行很少的更改。
workspace = "powerbi://api.powerbi.com/v1.0/myorg/Your Workspace"
# ^ XMLA Endpoint
username = 'your login id form PBI Service'
password = 'your PBI Service password'
前面我提到过,不同类型的 Analysis Services 的 model.bim 文件存在差异,因此,如果您有来自 SSAS Tabular 的 model.bim,则可以进行少量更改并使其适用于 PBI 数据集。
我将使用上一个示例中使用的 model.bim 并从中创建一个数据集。
所以当我们打开model.bim时我们实际上可以将其修改为:
with open(bim_file) as bim:
json_file = json.load(bim)
json_file.update({'compatibilityLevel':1571})
json_file['id'] = new_dataset_name
json_file['name'] = new_dataset_name
json_file['model']['defaultPowerBIDataSourceVersion'] = "powerBI_V3"
上面的代码更改了兼容性以及默认的PowerBIDataSourceVersion。
你需要进行的另一个更改是 CompatibilityMode:
db = AS.JsonSerializer.DeserializeDatabase(raw_json, DeserializeOptions = 'default', CompatibilityMode = 'PowerBI')
# Compatibility Modes:
# Analysis Services = 1
# Excel PowerPivot = 4
# PowerBI = 2
# Unknown = 0
完成后运行代码,你将看到数据集已创建,如果多次运行它,它将添加后缀 1、2、3 等。
完成后,只需将正确的数据源映射到网关即可。
PBI数据集版本的完整代码:
import json
import clr
folder = r"C:\Windows\Microsoft.NET\assembly\GAC_MSIL"
clr.AddReference(folder +
r"\Microsoft.AnalysisServices.Tabular\v4.0_15.0.0.0__89845dcd8080cc91\Microsoft.AnalysisServices.Tabular.DLL")
clr.AddReference(folder +
r"\Microsoft.AnalysisServices\v4.0_15.0.0.0__89845dcd8080cc91\Microsoft.AnalysisServices.DLL")
import Microsoft.AnalysisServices as AS
import Microsoft.AnalysisServices.Tabular as Tabular
workspace = "powerbi://api.powerbi.com/v1.0/myorg/Your Workspace"
username = 'your login id form PBI Service'
password = 'your PBI Service password'
conn_string = f"DataSource={workspace};User ID={username};Password={password};"
server = Tabular.Server()
server.Connect(conn_string)
new_dataset_name = server.Databases.GetNewName('Power BI Dataset w Python')
bim_file = r"C:\Users\antsharma\OneDrive\Desktop\Contoso Import.bim"
with open(bim_file) as bim:
json_file = json.load(bim)
json_file.update({'compatibilityLevel':1571})
json_file['id'] = new_dataset_name
json_file['name'] = new_dataset_name
json_file['model']['defaultPowerBIDataSourceVersion'] = "powerBI_V3"
raw_json = json.dumps(json_file, indent=4)
db = AS.JsonSerializer.DeserializeDatabase(raw_json, DeserializeOptions = 'default', CompatibilityMode = 'PowerBI')
# Compatibility Modes:
# Analysis Services = 1
# Excel PowerPivot = 4
# PowerBI = 2
# Unknown = 0
script = Tabular.JsonScripter.ScriptCreateOrReplace(db)
server.Execute(script)
server.Disconnect()