Azure Synapse中S3复制文件到Blob时如何自动转换文件夹结构
Azure Synapse S3到Blob自动路径映射复制方案
直接使用Copy活动内置的动态路径配置即可实现需求,不需要嵌套GetMetadata+ForEach逐文件遍历——后者在数千文件量级下性能极差,单Copy活动批量复制的效率是逐文件循环的10倍以上,全程不需要手动重命名文件,配置完成后可自动完成全量文件迁移。
前置准备
- 在Synapse工作区的「管理-链接服务」页面,分别创建Amazon S3、Azure Blob Storage两个链接服务,填入对应鉴权信息后测试连通性,保存备用。
源端(S3)数据集配置
- 新建Amazon S3数据集,文件格式选择二进制(如果全是同格式结构化文件也可选对应Parquet/CSV格式,选二进制不会修改文件内容,兼容性最好),关联已创建的S3链接服务。
- 路径配置选择「通配符路径」模式:
- 容器/桶名填你的S3存储桶名称
- 通配符文件夹路径填
data/*/*/*/files/ - 通配符文件名填
*
- 打开数据集的「递归遍历」开关,该配置会自动匹配所有
data/yyyy/mm/dd/files/路径下的文件,覆盖2019-2022全量日期目录,不需要手动枚举路径。
接收器(Blob Storage)动态规则配置
- 新建Azure Blob Storage数据集,文件格式和源端保持一致,关联已创建的Blob链接服务,路径字段全部留空,不预设固定值。
- 回到管道编辑画布,拖入1个Copy活动:
- 「源」选项卡直接选择刚才配置好的S3数据集,不需要额外加其他活动。
- 「接收器」选项卡选择刚才配置的Blob数据集,首先打开保留源文件名开关。
- 找到「目录路径」的动态内容输入框,粘贴以下表达式,自动从源路径解析日期字段生成目标层级:
@concat( 'data/year=', split(item().FolderPath, '/')[1], '/month=', split(item().FolderPath, '/')[2], '/day=', split(item().FolderPath, '/')[3], '/files' ) - 如果需要在文件名后附加日期时间字符串,找到「文件名」的动态内容输入框,粘贴以下表达式(时间格式可按需调整,示例为附加复制任务触发的UTC年月日时分):
@concat( item().FileName, '_', formatDateTime(utcNow(), 'yyyyMMddHHmm') )
大数量级性能调优
针对数千个文件的迁移场景,点开Copy活动的「设置」选项卡做如下配置:
- 将并行复制数调整为16~32(根据存储账号吞吐量调整,超过32容易触发存储侧限流)
- 打开「容错」开关,设置跳过不存在/权限异常的文件,避免个别坏文件中断全量任务
- 不需要开启分段迭代,单Copy活动会自动批量拉取文件列表并行复制,全量数千个文件通常数分钟即可跑完。
方案说明
- 不需要额外搭配GetMetadata、ForEach活动:逐文件遍历的方式会触发大量活动调度开销,文件量级大时跑数时间会达到数小时,还容易碰到管道活动迭代次数上限,通配符批量复制是Synapse官方推荐的大规模文件迁移方案。
- 如果需要筛选特定年份/月份的文件,只需要修改源端通配符路径即可,比如要只迁移2019-2021年文件,把通配符文件夹路径改成
data/201{9},202{0,1}/*/*/files/,其余配置不需要改动。 - 复制完成后目标Blob会直接生成
data/year=yyyy/month=mm/day=dd/files的层级结构,不需要后续手动重命名文件夹。
内容的提问来源于stack exchange,提问作者user19504539
相关产品推荐
相关产品推荐

