如何在Azure Data Factory中跨容器传输时动态重命名文件夹
Azure Data Factory 动态重命名文件夹&跨容器传输时修改文件夹名的实现方案
在ADF中没有直接的「重命名文件夹」活动,通常通过复制+可选删除的方式实现;跨容器传输时修改文件夹名则是在复制过程中动态指定目标路径。以下是具体步骤和常用场景:
一、核心依赖
实现动态操作主要依赖三个关键组件:
- Get Metadata 活动:获取源文件夹的元数据(如文件夹列表、子项信息)
- For Each 活动:遍历目标文件夹列表,批量处理
- 动态内容表达式:生成自定义的目标文件夹名称
二、场景1:同一容器内动态重命名文件夹
比如将raw_data重命名为raw_data_20240520,或批量给文件夹添加日期后缀:
配置Get Metadata活动
- 关联源存储容器的数据集,设置
字段为Child Items,路径指向包含目标文件夹的父目录(如/source_root/) - 此活动会输出父目录下所有文件和文件夹的列表
- 关联源存储容器的数据集,设置
添加For Each活动
- 设置
项目为@activity('Get Metadata活动名称').output.childItems - 勾选
并行处理(可选,提升批量处理效率) - 在项目筛选器中添加条件,只处理文件夹:
@equals(item().type, 'Folder')
- 设置
在For Each内添加Copy Activity
- 源数据集:路径设为
@item().name(即当前遍历的源文件夹) - 目标数据集:路径设为自定义的新文件夹名称,示例表达式:
- 添加日期后缀:
@concat(item().name, '_', formatDateTime(utcNow(), 'yyyyMMdd')) - 替换前缀:
@replace(item().name, 'raw', 'archived')
- 添加日期后缀:
- 确保目标数据集指向同一容器
- 源数据集:路径设为
可选:添加Delete Activity清理源文件夹
- 路径设为
@item().name,删除已复制完成的源文件夹(测试阶段建议先注释,避免误删)
- 路径设为
三、场景2:跨容器传输时动态修改目标文件夹名
比如从source-container的raw/文件夹传输到target-container的staged_20240520/:
获取源文件夹列表
- 用Get Metadata活动获取
source-container中要传输的文件夹列表(配置方式同场景1)
- 用Get Metadata活动获取
遍历并复制
- 在For Each活动内添加Copy Activity:
- 源数据集:指向
source-container,路径为@item().name - 目标数据集:指向
target-container,路径用动态表达式生成,示例:- 生成全新名称:
@concat('staged_', formatDateTime(utcNow(), 'yyyyMMdd'), '/', item().name) - 截取原名称部分字符:
@substring(item().name, 3, 8) + '_processed'
- 生成全新名称:
- 源数据集:指向
- 在For Each活动内添加Copy Activity:
四、常用动态表达式示例
- 按当前时间生成文件夹名:
@formatDateTime(utcNow(), 'yyyy-MM-dd_HH-mm') - 拼接固定前缀+原文件夹名:
@concat('processed_', item().name) - 根据原名称中的关键字分类:
@if(contains(item().name, 'sales'), 'sales_data/', 'other_data/') + item().name
五、注意事项
- 确保ADF服务主体或托管标识拥有源、目标容器的存储Blob数据 Contributor权限,否则会出现读写失败
- 若文件夹内包含大量小文件,建议在Copy Activity中启用并行复制(设置并行度为2-10)提升传输效率
- Delete Activity需谨慎使用,建议先通过调试验证复制逻辑正确后再启用
- 动态路径中的分隔符统一使用
/,避免使用反斜杠导致路径解析错误
内容的提问来源于stack exchange,提问作者Rajesh Dhawan
相关产品推荐
相关产品推荐

