如何用Azure Data Factory复制活动迁移ADLS Gen1到Gen2时批量重命名文件夹?
在Azure Data Factory中实现Gen1到Gen2的文件夹结构转换(y=yyyy/m=MM/d=dd → yyyy/MM/dd)
要实现从Gen1的y=2022/m=08/d=01结构迁移到Gen2的2022/08/01结构,核心是利用ADF的动态内容提取日期片段,再配合批量遍历逻辑覆盖全年日期,具体步骤如下:
1. 基础配置:源与目标数据集
- 源数据集(Gen1):
配置文件夹路径为通配符格式y=*/m=*/d=*,开启递归选项,确保能读取目标文件夹下的所有文件。如果需要精确控制,也可以通过参数化路径配合后续循环使用。 - 目标数据集(Gen2):
暂不固定文件夹路径,后续在复制活动中用动态内容生成目标路径。
2. 批量遍历所有日期文件夹
要覆盖全年所有月份和日期,需要先获取Gen1中所有符合结构的文件夹,再逐个处理:
- 添加Get Metadata活动:
数据源选择Gen1数据集,路径设置为包含所有y=*文件夹的根目录,勾选子项选项,用于获取所有日期层级的文件夹列表。 - 添加For Each活动:
输入设置为@activity('Get Metadata').output.childItems,勾选Sequential(可选,避免并发过高导致的资源限制),循环遍历每个日期文件夹。
3. 复制活动中动态生成目标路径
在For Each活动内部添加Copy Data活动,配置如下:
源设置:
文件夹路径设为@item().name(item()代表Get Metadata返回的单个文件夹对象,name属性即为y=2022/m=08/d=01格式的路径),保持递归开启。目标设置:
文件夹路径使用动态内容生成,推荐两种简洁方式:
方式一:字符串替换法(最直观)@replace(replace(replace(item().name, 'y=', ''), 'm=', ''), 'd=', '')该逻辑会把路径中的
y=、m=、d=逐一替换为空,直接得到2022/08/01。方式二:拆分截取法(更灵活,适合格式调整)
@concat( split(item().name, '/')[0].substring(2), '/', split(item().name, '/')[1].substring(2), '/', split(item().name, '/')[2].substring(2) )通过
split按/拆分路径,再用substring(2)截取等号后的日期片段,最后拼接成目标路径。覆盖设置:
在复制活动的设置选项卡中勾选覆盖,确保目标已有文件会被更新。
4. 特殊场景处理
如果源文件夹存在单数字月份/日期(如m=8而非m=08),可以用formatNumber函数补零,确保目标路径格式统一:
@concat( split(item().name, '/')[0].substring(2), '/', formatNumber(int(split(item().name, '/')[1].substring(2)), '00'), '/', formatNumber(int(split(item().name, '/')[2].substring(2)), '00') )
内容的提问来源于stack exchange,提问作者Ash3060
相关产品推荐
相关产品推荐

