启用暂存的Data Factory/Synapse复制任务无文件时失败求助
解决ADLS Gen2到Synapse专用池复制活动无文件时的失败问题
问题场景
我们有一个元数据驱动的管道,用于将ADLS Gen2数据湖中存储的Parquet文件复制到Synapse专用SQL池:
- 管道遍历源容器列表,通过最后修改时间过滤处理每个容器中的新文件
- 因需在插入专用池前添加日志列,启用了暂存功能
当前问题:当未找到新文件时,复制活动的暂存步骤仍会执行,后续从暂存到Synapse的步骤因临时位置无文件而失败。尝试过用Get Metadata活动做前置检查,但常规Get Metadata不支持递归检查,而动态递归列表方案开销过大无法采用。
可行解决方案
方案1:开启复制活动的「允许无数据」配置
这是最直接的方案,通过复制活动的内置设置避免无文件时的失败:
- 打开复制活动的Settings标签页
- 找到Allow no data选项并勾选
- 启用后,当源路径下无匹配过滤条件的文件时,复制活动会标记为「成功」,不会执行后续暂存到Synapse的步骤,自然避免失败
方案2:用Lookup活动做低开销的前置文件检查
通过Lookup活动快速判断是否存在符合条件的文件,仅在有文件时执行复制活动:
- 添加一个Lookup活动,源数据集指向ADLS Gen2的目标文件夹(如
raw/data/),开启递归选项 - 在数据集配置中,通过参数化设置最后修改时间过滤条件(匹配复制活动的过滤规则)
- 设置Lookup活动的Top count为1,这样只要找到1个符合条件的文件就停止查询,把开销降到最低
- 添加If Condition活动,判断表达式:
@activity('你的Lookup活动名称').output.count > 0- 条件为真:执行复制活动
- 条件为假:跳过复制活动,继续后续流程
方案3:错误捕获与容错处理
如果无法修改复制活动配置或前置检查,可通过错误分支处理无文件的失败场景:
- 点击复制活动的添加分支,选择On Failure
- 在失败分支中添加If Condition活动,判断错误是否为「无文件」:
- 示例表达式:
@contains(activity('你的复制活动名称').error.message, 'No files found')或@equals(activity('你的复制活动名称').error.code, '2200')
- 示例表达式:
- 若判断为无文件错误:添加一个空的Set Variable活动(或直接不做操作),让流程继续执行,不终止
- 若判断为其他错误:保留原有失败逻辑,抛出错误
内容的提问来源于stack exchange,提问作者Koen van Wielink
相关产品推荐
相关产品推荐

