如何用ADF将含多数组的复杂JSON转换为CSV?
解决Azure Data Factory多层JSON转CSV的重复行问题
问题本质
两次独立执行Flatten分别处理elementCollection和attributes,本质是让两个无直接关联的数组产生了笛卡尔积关联——19条元素×100个属性,自然生成1900行冗余数据,仅当元素与属性的关联ID匹配时才会出现有效值。
可行解决方案
方案一:嵌套Flatten+属性列映射
- 第一步Flatten:仅展开元素集合
- 源JSON接入后,添加Flatten转换,只选择
elementCollection数组进行展开,保留每个元素对应的attributes嵌套数组不展开。
- 源JSON接入后,添加Flatten转换,只选择
- 第二步Flatten:按元素嵌套展开属性
- 对每个元素下的
attributes数组执行Flatten,此时是基于单个元素的嵌套展开,不会跨元素关联属性,从根源避免笛卡尔积。
- 对每个元素下的
- 派生列生成目标CSV字段
- 添加派生列转换,针对每个需要输出的属性列,用条件表达式提取对应值:
重复此操作生成所有需要的CSV列。if(attributes.name == "用户ID", attributes.value, null)
- 添加派生列转换,针对每个需要输出的属性列,用条件表达式提取对应值:
- 聚合合并单行
- 添加Aggregate转换,按元素的唯一标识(比如
elementId)分组,对每个属性列用max()函数提取有效值(同一元素的属性行仅对应列有值,其余为null,max会自动取非空值),最终合并为单行元素数据。
- 添加Aggregate转换,按元素的唯一标识(比如
方案二:先聚合属性为结构化对象再关联
- 聚合属性数组
- 先添加Aggregate转换,按属性所属的
elementId分组,用collect函数将同一元素的属性聚合为键值对集合:collect(@(key=attributes.name, value=attributes.value))
- 先添加Aggregate转换,按属性所属的
- 展开元素集合
- 添加Flatten转换展开
elementCollection数组。
- 添加Flatten转换展开
- 关联元素与属性
- 添加Join转换,通过
elementId将展开后的元素与聚合后的属性数据关联,此时是一对一关联,不会产生重复行。
- 添加Join转换,通过
- 派生列提取属性值
- 用
lookup函数从属性集合中提取对应值生成CSV列:lookup(attributes_collection, "key", "用户ID").value
- 用
内容的提问来源于stack exchange,提问作者Nandini
相关产品推荐
相关产品推荐

