如何通过ADF Dataflow聚合CSV数据生成目标JSON结构?
实现ADF中按father分组生成嵌套JSON的方案
方案一:DataFlow聚合+派生列组合(推荐,适配动态列场景)
如果你已经在用DataFlow,直接通过以下步骤完成分组聚合:
- 派生列生成单条Report对象:添加派生列转换,命名为
reportItem,用表达式将当前行除father外的所有字段转为JSON对象:
这个表达式会自动忽略toJson(mapColumns(remove($$, 'father'), #item))father列,把date、record1~recordn全部打包成一个JSON对象,不用硬编码列名,适配record列数量动态变化的场景。 - 按father聚合Report数组:添加聚合转换,分组键选择
father,然后添加聚合列Reports,用collect(reportItem)函数把同father的所有reportItem收集成一个数组。 - 生成最终JSON结构:再添加一个派生列,将
father和Reports数组组合成目标JSON结构,表达式:toJson({father: father, Reports: Reports}) - Sink输出设置:选择JSON格式的Sink,若要输出单个包含所有分组的JSON文件,开启「输出到单个文件」,并在JSON设置中选择「数组格式」;若要每个father对应一个JSON对象,选择「每行一个对象」即可。
方案二:Copy Activity层级映射(适合固定列、快速实现)
如果不想用DataFlow,可直接通过Copy Activity的层级映射完成分组:
- 源配置为CSV数据集,目标配置为JSON数据集。
- 进入「映射」面板,切换到层级模式:
- 创建根节点,将CSV的
father字段映射到根节点的father属性。 - 创建
Reports数组节点,将CSV的date、record1~recordn全部映射到该数组的子节点。
- 创建根节点,将CSV的
- 开启分组设置:在层级映射的根节点上,设置分组键为
father。 - 注意事项:必须确保CSV数据已按
father排序(可在源数据集的查询中添加ORDER BY father,或先通过DataFlow排序),否则Copy Activity的分组逻辑会失效。
关键注意点
- 若
record1~recordn的列数不固定,优先选方案一,mapColumns函数能自动适配所有非father列。 - 聚合后的JSON输出格式可根据需求调整,Sink的JSON设置决定最终输出是单个数组还是多行对象。
内容的提问来源于stack exchange,提问作者GelineAstra
相关产品推荐
相关产品推荐

