Azure Data Factory多子文件夹递归复制至单文件夹同名文件问题
Azure Data Factory V2 实现多子文件夹文件平级复制(保留原文件名)
方案1:Get Metadata + ForEach + Copy Activity(自定义文件名映射)
核心是绕过ADF默认的文件命名逻辑,手动指定目标文件名与源文件名一致,步骤如下:
- Get Metadata 活动:配置源数据集为根文件夹,勾选
Child items选项,获取所有子文件夹及文件的元数据列表。 - Filter 活动(可选):添加Filter活动,筛选元数据中
type为File的项,只保留文件对象,避免遍历空文件夹。 - ForEach 活动:遍历筛选后的文件列表,内部添加Copy Activity:
- 源数据集:用动态内容
@item().path指定单个文件的完整路径。 - 目标数据集:配置为目标根文件夹,文件名字段使用动态内容
@item().name,强制目标文件使用源文件的原始名称。
- 源数据集:用动态内容
- 重名处理:若存在重名文件,可在文件名动态内容中添加前缀(如
@concat(split(item().path, '/')[sub(length(split(item().path, '/')),2)], '_', item().name)),或在Copy Activity的Conflict resolution中选择Overwrite/Fail,按需配置。
方案2:Azure Function 配合ADF执行
如果ADF原生组件灵活性不足,用Azure Function实现更直接:
- 编写Azure Function:用C#或Python编写函数,逻辑为:遍历源存储容器根文件夹下所有层级的文件,逐个复制到目标容器根文件夹并保留原文件名,同时处理重名逻辑(覆盖、重命名或报错)。
- ADF调用Function:在管道中添加
Azure Function活动,传入源根路径、目标根路径等参数,触发函数执行即可。
方案3:Data Flow 批量平级复制
针对大数量文件,用Data Flow批量处理效率更高:
- Source 数据集:配置源根文件夹,
Wildcard paths填写**(匹配所有层级子文件夹),读取所有文件。 - 派生列转换:添加派生列,用表达式
@split($$FilePath, '/')[last()]提取源文件的原始名称,命名为FileName。 - Sink 数据集:配置目标根文件夹,关闭
Preserve hierarchy,File name option选择As data in column,并指定用FileName列作为目标文件名。
原方法失败原因说明
- 方法1的Flatten模式自动重命名,是因为默认采用了带层级前缀的文件名生成逻辑,手动指定
@item().name即可覆盖。 - 方法2嵌套ForEach未成功,大概率是未正确提取单个文件的原始名称,或未在Copy Activity中覆盖默认的文件名规则。
内容的提问来源于stack exchange,提问作者Pranjal
相关产品推荐
相关产品推荐

