Power Query处理API JSON响应转扁平表问题(Microsoft Fabric环境)
在Microsoft Fabric Gen2数据流中用Power Query转换嵌套JSON为扁平表
问题背景
从API获取的JSON结构如下:
{ "Dimension1": { "TimeStamp1": "Fact 11", "TimeStamp2": "Fact 12" }, "Dimension2": { "TimeStamp1": "Fact 21", "TimeStamp2": "Fact 22" } }
需要将其转换为扁平表存入LakeHouse,目标格式支持两种:
宽表格式(与Pandas转换结果一致)
| TimeStamp | Dimension1 | Dimension2 |
|---|---|---|
| TimeStamp1 | Fact 11 | Fact 21 |
| TimeStamp2 | Fact 12 | Fact 22 |
长表格式(更具扩展性)
| TimeStamp | Dimension | Fact |
|---|---|---|
| TimeStamp1 | Dimension1 | Fact 11 |
| TimeStamp2 | Dimension1 | Fact 12 |
| TimeStamp1 | Dimension2 | Fact 21 |
| TimeStamp2 | Dimension2 | Fact 22 |
此前直接转表扩展列存在三个问题:数千个TimeStamp时扩展性差、M查询冗长、操作后数据丢失为null。
解决方案1:生成长表(推荐,适配任意数量的维度/时间戳)
通过动态解析键值对的方式处理,无需硬编码列名,步骤如下:
let // 替换为你的API数据源步骤(比如Web.Contents调用结果) 源 = Web.Contents("<你的API地址>"), // 解析JSON为记录 解析JSON = Json.Document(源), // 将顶层维度记录转为键值对表(Dimension=维度名,Value=对应时间戳-事实记录) 转为维度键值表 = Table.FromRecords(Record.ToTable(解析JSON)), // 将每个维度的时间戳-事实记录转为子表 添加时间戳事实子表 = Table.AddColumn(转为维度键值表, "时间戳事实表", each Table.FromRecords(Record.ToTable([Value]))), // 展开子表,提取时间戳和事实值 展开时间戳事实表 = Table.ExpandTableColumn(添加时间戳事实子表, "时间戳事实表", {"Name", "Value"}, {"TimeStamp", "Fact"}), // 整理列名 重命名列 = Table.RenameColumns(展开时间戳事实表, {{"Name", "Dimension"}}) in 重命名列
关键逻辑说明
Record.ToTable():将嵌套记录动态转为键值对表,自动适配所有维度和时间戳,无需手动指定列- 全程动态处理,不管维度或时间戳数量多少,M代码保持简洁,不会出现显式列名堆积
- 避免了硬编码路径导致的数据丢失问题
解决方案2:生成宽表(匹配Pandas输出)
基于上面的长表结果,通过透视操作快速转换为宽表:
let // 复用上述长表的完整步骤,或直接引用长表结果 长表结果 = <上述长表的最终步骤>, // 透视维度列为表头,事实值填充单元格(聚合用First,因为每个时间戳+维度组合唯一) 透视为宽表 = Table.Pivot(长表结果, List.Distinct(长表结果[Dimension]), "Dimension", "Fact", (values) => values{0}) in 透视为宽表
关键逻辑说明
Table.Pivot()动态生成维度列,无需手动指定列名- 聚合函数用
(values) => values{0}确保唯一值正确提取,避免数据丢失
内容的提问来源于stack exchange,提问作者Mike Tomaino
相关产品推荐
相关产品推荐

