Azure Data Factory复杂JSON映射问题:嵌套数组仅取首元素
ADF无DataFlow下嵌套数组JSON转Parquet的解决方案
方案1:优化Copy Activity的映射配置(优先尝试)
直接通过Copy Activity的源和映射设置解决数组展开问题:
- 源端配置:如果JSON的嵌套数组
ChildRows在父对象内部,在Copy Activity的源设置中,将JSON格式的Array path设为数组的完整路径(例如$.ParentRows[*].ChildRows,根据实际JSON结构调整),让ADF自动识别数组并展开所有元素。 - 映射配置:点击映射界面的导入 schemas,确保父级字段和子数组的所有字段都被加载。对于父级字段,使用表达式引用父级元素,比如要映射父级的
rowuid_Parent,表达式写../rowuid_Parent,这样每个子数组元素都会关联对应的父数据,实现Cross Join效果。 - 禁止手动按索引映射(比如
ChildRows[0].rowuid_Child),直接选择子数组内的字段,ADF会自动遍历所有数组元素生成行。
如果源是API输出,建议先通过Copy Activity将API响应保存到Blob/ADLS存储,再用上述方法处理存储中的JSON文件,避免API源的格式限制。
方案2:Lookup+ForEach+Copy组合处理
如果方案1无法生效,用活动组合实现数组遍历和数据合并:
- Lookup Activity:读取目标JSON文件,勾选
First row only(如果JSON根是单个包含数组的对象),获取完整的父级数据和ChildRows数组。 - 变量初始化:创建一个类型为
Array的变量(比如combinedData),用于存储合并后的每行数据。 - ForEach Activity:设置
Items为@activity('Lookup').output.value[0].ChildRows,遍历ChildRows的每个元素。 - Set Variable Activity:在ForEach内部,将当前子元素与父级字段合并为单个对象,示例表达式:
(根据实际字段调整键名和值的类型)@json(concat('{"rowuid_Parent":"', activity('Lookup').output.value[0].rowuid_Parent, '","rowuid_Child":"', item().rowuid_Child, '"}')) - Append Variable Activity:将上述合并后的对象添加到
combinedData变量中。 - Copy Activity:源选择变量,指向
combinedData;目标选择Parquet存储,自动导入字段映射,完成数据写入。
内容的提问来源于stack exchange,提问作者Zoro4246
相关产品推荐
相关产品推荐

