如何在ADF Copy活动中识别并捕获被拒绝的数据行?
解决ADF Copy任务向Snowflake复制时拒绝行重定向的方案
核心思路
利用Snowflake COPY INTO命令的错误处理参数,将被拒绝的行数据定向存储到指定位置,同时保留错误详情,方便后续定位源表数据。
1. 配置Snowflake COPY INTO的错误处理参数
ADF的Copy任务底层调用Snowflake的COPY INTO命令,需在ADF中添加以下关键参数:
ON_ERROR = 'CONTINUE':让复制任务遇到错误时继续运行,不中断全量复制ERROR_LOCATION = '@<你的外部stage名称>/error_logs':指定存储拒绝行和错误日志的路径,需提前在Snowflake中创建对应外部stage(与ADF使用的存储服务绑定,比如Azure Blob)REJECTED_RECORD_FORMAT = 'TYPE=CSV FIELD_DELIMITER=','':定义拒绝文件的格式,方便后续读取
2. 在ADF复制活动中设置附加参数
打开ADF复制活动的「Sink」选项卡,找到「Snowflake copy options」下的「Additional copy options」,输入完整参数示例:
ON_ERROR = 'CONTINUE', ERROR_LOCATION = '@my_azure_stage/rejected_data', REJECTED_RECORD_FORMAT = 'TYPE=CSV FIELD_DELIMITER=',''
注意:确保Snowflake的外部stage拥有读写权限,且ADF使用的身份验证方式(服务主体/密钥)能访问对应的存储容器。
3. 获取并分析拒绝行数据
任务运行完成后:
- 直接在Snowflake中查询拒绝记录:
-- 查看拒绝文件的结构 SELECT * FROM TABLE(INFER_SCHEMA(LOCATION => '@my_azure_stage/rejected_data')); -- 读取拒绝的行内容 SELECT $1, $2, $3 FROM @my_azure_stage/rejected_data/rejected_records_<查询ID>.csv; - 也可以直接到对应的存储服务(比如Azure Blob Storage)中下载拒绝文件,查看具体的错误行内容。
4. 关联定位源SQL表中的行
- 如果源SQL表有唯一主键:复制时将主键字段纳入复制字段列表,拒绝文件中会包含主键值,直接用主键在源表中查询对应行。
- 如果无主键:在源查询中添加行号(如SQL Server使用
ROW_NUMBER() OVER(ORDER BY <字段>) AS row_id),复制时带上该行号,通过拒绝文件中的行号反向定位源查询结果,进而找到源表数据。
5. 利用现有日志快速定位
日志中提到的first error line 2是指ADF生成的中间数据文件(示例中的data_xxxx.txt)的第2行,可直接下载该中间文件,查看对应行内容,先锁定错误数据的特征,再反向查找源表。
内容的提问来源于stack exchange,提问作者Mahesh
相关产品推荐
相关产品推荐

