如何用ADF合并JSON文件并添加原文件名作为数据键?
解决方案:ADF实现带文件名键的JSON合并(替代Lookup)
ADF原生复制活动无法直接实现
ADF复制活动的合并功能仅支持将多个JSON对象/数组直接拼接,无法自动保留原文件名作为键,也无法按文件名分组聚合数据到数组,所以单纯用复制活动达不到需求。
推荐方案1:使用ADF数据流(无大小限制)
数据流适合处理大规模数据,没有Lookup活动的大小限制,步骤如下:
配置源数据集
- 源类型选Blob存储,路径使用通配符(如
container/folder/*.json) - 在源转换的选项中,勾选「保留文件名」,添加自定义列(比如命名为
SourceFileName),值选择FileName变量,让每个数据行带上原文件名称
- 源类型选Blob存储,路径使用通配符(如
解析JSON内容
- 添加「解析」转换,将源文件的JSON内容列(默认是
$Content)解析为结构化数据:- 若原文件是单个JSON对象,用「派生列」转为数组,表达式:
array($ParsedContent) - 若原文件本身是JSON数组,直接解析即可
- 若原文件是单个JSON对象,用「派生列」转为数组,表达式:
- 添加「解析」转换,将源文件的JSON内容列(默认是
按文件名分组聚合
- 添加「聚合」转换,分组键选择
SourceFileName,新增聚合列(比如DataArray),用collect()函数将分组内的数据行聚合为数组,表达式:collect($ParsedContent)
- 添加「聚合」转换,分组键选择
构建键值对结构
- 添加「派生列」转换,生成文件名对应的键值对对象,表达式示例:
@createMap(SourceFileName, DataArray)
- 添加「派生列」转换,生成文件名对应的键值对对象,表达式示例:
合并为单个JSON对象
- 再添加一个「聚合」转换,不设置分组键,用
collect()将所有键值对聚合为数组,再转为单个JSON对象,表达式:replace(stringify(collect(KeyValuePair)), '[[', '{').replace(']]', '}')
- 再添加一个「聚合」转换,不设置分组键,用
配置接收器
- 接收器选Blob存储,格式为JSON,设置为「单个文件」,将合并后的JSON写入目标Blob
替代方案2:使用Azure Function(灵活处理复杂场景)
如果数据流处理复杂嵌套JSON有困难,可采用Azure Function实现:
- 触发方式:用Blob存储触发器监听源文件容器的新增文件,或定时触发遍历所有目标文件
- 核心逻辑:
- 遍历指定容器内的所有JSON文件(可过滤已处理文件)
- 逐个读取文件内容,将单个JSON对象转为数组(原文件是数组则直接使用)
- 以文件名(不含
.json后缀)为键,将数组存入字典 - 将字典序列化为JSON字符串,写入目标Blob文件
- 优势:完全自定义逻辑,适配任何JSON结构,无数据大小限制(只要Function内存足够)
内容的提问来源于stack exchange,提问作者Sakhi
相关产品推荐
相关产品推荐

