如何从实时连接模式的精简PBIX报表中提取度量值Lineage ID?
从实时连接的精简PBIX中提取度量值Lineage ID并关联DAX表达式
可以实现,但精简PBIX(实时连接模式)本身不直接存储数据集的Lineage ID,需要通过解析报表布局的JSON结构提取度量值的关联标识符,再与数据集DMV的LineageTag匹配。以下是具体实现步骤:
1. 解析精简PBIX的报表布局,提取度量值信息
实时连接的PBIX解压后,Report/Layout/Report.json包含了报表中所有对象的引用信息。你需要从中提取:
- 度量值的显示名称(报表中展示的名称)
- 对应的
lineageTag(与数据集DMV中LineageTag匹配的唯一标识)
用PowerQuery实现解析的示例代码:
let // 解压PBIX并读取Report.json PBIXPath = "C:\YourPath\YourReport.pbix", TempFolder = "C:\Temp\PBIXExtract", ExtractPBIX = Shell.Execute("powershell", "-Command Expand-Archive -Path '" & PBIXPath & "' -DestinationPath '" & TempFolder & "' -Force"), ReportJsonPath = TempFolder & "\Report\Layout\Report.json", ReportJson = Json.Document(File.Contents(ReportJsonPath)), // 递归遍历JSON,提取所有度量值引用 ExtractMeasureReferences = (json as any) as list => let IsList = Value.Is(json, List.Type), IsRecord = Value.Is(json, Record.Type), ProcessList = if IsList then List.Transform(json, ExtractMeasureReferences) else {}, ProcessRecord = if IsRecord then let CheckMeasure = if Record.HasFields(json, {"lineageTag", "displayName"}) and Record.Field(json, "objectType") = "Measure" then {[DisplayName = Record.Field(json, "displayName"), LineageTag = Record.Field(json, "lineageTag")]} else {}, ProcessFields = List.Transform(Record.FieldNames(json), (field) => ExtractMeasureReferences(Record.Field(json, field))) in CheckMeasure & List.Combine(ProcessFields) else {}, Result = if IsList then List.Combine(ProcessList) else if IsRecord then List.Combine(ProcessRecord) else {} in Result, MeasureReferences = ExtractMeasureReferences(ReportJson), // 去重并整理成表格 MeasureTable = Table.FromList(MeasureReferences, Splitter.SplitByNothing(), null, null, ExtraValues.Error), ExpandColumns = Table.ExpandRecordColumn(MeasureTable, "Column1", {"DisplayName", "LineageTag"}, {"显示名称", "LineageTag"}), RemoveDuplicates = Table.Distinct(ExpandColumns, {"显示名称", "LineageTag"}) in RemoveDuplicates
2. 从数据集DMV获取度量值的LineageTag与DAX表达式
通过PowerQuery连接到Power BI数据集,执行DMV查询获取度量值信息:
let // 连接到Power BI数据集(实时连接的数据源) Source = AnalysisServices.Database("powerbi://api.powerbi.com/v1.0/myorg/YourWorkspace", "YourDataset"), // 执行DMV查询 DMVQuery = Source{[Name="$SYSTEM.TMSCHEMA_MEASURES"]}[Data], // 保留需要的列 CleanedDMV = Table.SelectColumns(DMVQuery, {"LineageTag", "Name", "Expression"}) in CleanedDMV
3. 关联报表与数据集的度量值,生成目标表格
将两个表格通过LineageTag列合并,得到包含报表显示名称和对应DAX表达式的结果:
let // 加载前面步骤生成的两个表格 ReportMeasures = /* 第一步的结果 */, DatasetMeasures = /* 第二步的结果 */, // 合并表格 MergedTables = Table.NestedJoin(ReportMeasures, {"LineageTag"}, DatasetMeasures, {"LineageTag"}, "DatasetMeasures", JoinKind.LeftOuter), // 展开DAX表达式列 ExpandDAX = Table.ExpandTableColumn(MergedTables, "DatasetMeasures", {"Expression"}, {"DAX表达式"}), // 整理列顺序 ReorderedColumns = Table.ReorderColumns(ExpandDAX, {"显示名称", "DAX表达式", "LineageTag"}) in ReorderedColumns
注意事项
- 若报表中存在报表级度量值(非引用数据集的度量),这类度量的
LineageTag不会在数据集DMV中存在,需根据需求过滤或单独处理。 - 部分情况下,报表布局JSON中的度量值引用可能嵌套在
visualContainers、filters或pageLevelFilters等节点下,递归遍历逻辑需确保覆盖所有可能的位置。
内容的提问来源于stack exchange,提问作者Przemyslaw Remin
相关产品推荐
相关产品推荐

