如何在ADF管道中递归复制文件至扁平目标并自定义文件名
解决方案:ADF实现多层级存储文件扁平化复制并自定义文件名前缀
核心思路
通过Get Metadata获取全量文件路径 + 动态表达式处理文件名 + Foreach循环批量复制,同时开启分块复制支持大文件,完美适配3/4级源目录结构。
具体步骤
获取所有源文件的完整路径
- 创建Get Metadata活动,源数据集指向源存储的目标容器(比如示例中的B),勾选
Child Items选项,这样能拿到所有文件的ItemPath(完整路径,如B/x/y/z/C)和Name(文件名,如C)。
- 创建Get Metadata活动,源数据集指向源存储的目标容器(比如示例中的B),勾选
编写动态表达式生成目标文件名
针对每个文件,提取容器后的目录层级并替换为__,再拼接文件名:@join(range(1, length(split(item().ItemPath, '/'))-1), '__') + '__' + item().Name逻辑说明:
split(item().ItemPath, '/'):把完整路径拆成数组,比如B/x/y/z/C拆成['B','x','y','z','C']range(1, length(...) -1):取容器之后、文件名之前的所有目录层级(索引1到倒数第2位)join(..., '__'):把目录层级用__拼接- 最后加上
__和原文件名,得到x__y__z__C
Foreach循环批量复制文件
- 把Get Metadata的
Child Items作为Foreach的迭代项,设置Sequential为否(提高处理效率) - 循环内添加Copy活动:
- 源数据集:动态指定单个文件路径,表达式为
@item().ItemPath - 目标数据集:文件名用步骤2的动态表达式,目标容器选目标存储的对应容器
- 复制活动设置:开启启用分块复制,块大小建议设为100MB(适配>10GB的大文件)
- 源数据集:动态指定单个文件路径,表达式为
- 把Get Metadata的
针对之前方案的优化点
之前用Get Metadata+Foreach失败,大概率是没处理好不同层级的路径逻辑,上述表达式不管是3级(B/a/b/D→a__b__D)还是4级路径都能自动适配,无需提前区分层级结构。
额外提示
如果文件量极大,可考虑用ADF数据流替代Foreach:
- 用Get Metadata获取文件列表作为数据流源
- 添加派生列生成目标文件名
- Sink设置为扁平结构,文件名用派生列的值
- 数据流同样支持大文件分块处理,适合超大规模文件复制
内容的提问来源于stack exchange,提问作者s s
相关产品推荐
相关产品推荐

