如何用Azure Data Factory检查SFTP与存储账户文件并同步缺失文件
解决方案:ADF动态检查SFTP文件并同步缺失文件到Azure存储
你的初步思路完全可行,下面是适配多文件夹、多命名格式场景的落地步骤:
1. 前置准备:配置参数化数据集
- 分别创建SFTP数据集和Azure存储(Blob/ADLS)数据集,确保连接正常。
- 给两个数据集都添加
fileName参数,SFTP数据集额外添加folderPath参数,用来动态定位文件位置。
2. 管道核心流程设计
步骤1:批量获取SFTP目标文件夹的文件列表
- 先添加Set Variable活动,定义数组变量
targetFolders,值设为['Import', 'Export/folder1'],用来指定需要检查的SFTP文件夹。 - 添加Foreach活动遍历
targetFolders,内部嵌套Get Metadata活动:连接SFTP数据集,将folderPath参数设为@item(),Field List选择childItems,以此获取当前文件夹下的所有文件信息。 - 用Filter活动过滤掉返回结果中的文件夹类型(只保留
type为File的项),避免后续处理出错。
步骤2:提前获取Azure存储的文件列表(优化效率)
- 在管道开头添加Get Metadata活动,连接Azure存储数据集,
Field List选择childItems,把返回的文件名列表存入数组变量azureFileNames(用Set Variable活动提取:@activity('Get Azure Files').output.childItems.name)。
步骤3:遍历SFTP文件并处理缺失项
- 添加Foreach活动,输入为第一步整理好的SFTP文件列表,可勾选
Sequential避免并发过高。 - 内部流程:
- 添加If Condition活动,判断条件设为
@not(contains(variables('azureFileNames'), item().name)),直接检查当前SFTP文件名是否在Azure存储列表中。 - 在
True分支(文件缺失)添加Copy活动:源数据集选SFTP,设置folderPath为@item().folderPath、fileName为@item().name;目标数据集选Azure存储,fileName设为@item().name,完成缺失文件复制。
- 添加If Condition活动,判断条件设为
3. 多日期格式的适配注意事项
- 由于Export/folder1下存在两种日期格式的文件,直接用原文件名全匹配即可,无需转换日期格式——避免因格式转换导致匹配错误,毕竟Azure存储中的文件是无组织存放的,文件名是唯一标识。
- 如果Azure存储文件名存在大小写差异,可把判断条件改为
@not(contains(toLower(variables('azureFileNames')), toLower(item().name))),统一大小写后再匹配。
4. 额外优化建议
- 添加Set Variable活动记录缺失文件名(存入数组变量
missingFiles),管道结束后可通过Log活动输出,方便后续排查。 - 给Copy活动添加重试机制,应对临时网络波动导致的传输失败。
内容的提问来源于stack exchange,提问作者Kevin Vallot
相关产品推荐
相关产品推荐

