You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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转换结果一致)

TimeStampDimension1Dimension2
TimeStamp1Fact 11Fact 21
TimeStamp2Fact 12Fact 22

长表格式(更具扩展性)

TimeStampDimensionFact
TimeStamp1Dimension1Fact 11
TimeStamp2Dimension1Fact 12
TimeStamp1Dimension2Fact 21
TimeStamp2Dimension2Fact 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.10 00:46:03