Azure Data Factory 管道批量处理:如何统计文件大小按2GB批次迁移本地文件到ADLS
ADF中按文件大小批量分组上传ADLS的实现方案(含文件总大小计算逻辑)
1 前置步骤:获取所有文件的元数据
- 首先使用
Get Metadata活动,关联本地文件存储的链接服务,数据集选择对应的本地文件夹路径,在活动配置的字段列表中勾选子项列表(Child Items)和大小(Size),即可拉取到目标路径下所有文件的文件名、单文件大小(单位为字节)数据。 - 若本地路径包含子文件夹,额外勾选*递归(Recursive)*选项即可遍历所有层级的文件。
2 文件总大小计算与分批的两种实现方式
方案1:ForEach循环累加(轻量化场景首选,无需额外资源)
- 先在管道中初始化3个变量:
当前批次文件列表:Array类型,默认值为空所有批次分组结果:Array类型,默认值为空当前批次总大小:Long类型,默认值为0
- 将
Get Metadata返回的Child Items数组作为For Each活动的输入,必须勾选顺序执行(Sequential),禁止并行执行避免累加逻辑出错。 For Each内部按以下逻辑配置:- 计算当前文件加入后批次的总大小:
@add(variables('当前批次总大小'), item().size) - 若计算结果小于2147483648(即2GB对应的字节数):
- 用
Append variable活动将当前文件名追加到当前批次文件列表 - 用
Set variable活动将当前批次总大小更新为刚才的计算值
- 用
- 若计算结果大于等于2147483648:
- 先将当前的
当前批次文件列表追加到所有批次分组结果 - 重置
当前批次文件列表为仅包含当前遍历的文件,重置当前批次总大小为当前文件的size
- 先将当前的
- 计算当前文件加入后批次的总大小:
For Each循环结束后额外加一步判断:如果当前批次文件列表不为空,将最后一批未满2GB的文件也追加到所有批次分组结果,避免遗漏文件。
方案2:映射数据流聚合计算(适合文件数量过千的高性能场景)
- 先通过
Get Metadata拉取所有文件元数据,用Set variable活动存储Child Items数组。 - 新建映射数据流,源选择缓存源(Cache Source),将刚才存储的数组作为源输入,映射
name(文件名)和size(文件大小)两个字段。 - 添加窗口转换(Window Transformation),排序规则可按文件名/文件创建时间排序,用累加聚合函数计算每个文件对应的累计总大小:
sum(size) over (order by name rows between unbounded preceding and current row)。 - 添加派生列转换,计算每个文件所属的批次号:
floor(累计总大小 / 2147483648)。 - 最后添加聚合转换,按批次号分组,将同批次的文件名聚合为数组,直接就能得到所有符合大小要求的文件分组,无需循环遍历,大批量文件场景下效率远高于ForEach方案。
3 后续流程调用
拿到所有批次分组结果后,再用一个For Each活动遍历每个批次的文件列表,调用复制活动或者子管道,将对应批次的文件复制到ADLS即可。
内容的提问来源于stack exchange,提问作者Nitin
相关产品推荐
相关产品推荐

