ADF复制活动跳过与推断Schema不符的表存储行问题咨询
关于Azure Data Factory Copy Activity处理混合数据类型字段的问题
问题背景
- 使用ADF的Copy Activity跨存储账户复制表,要求复制结果与源表完全一致
- 源表中
ExpectedArrivalDate字段为混合数据类型:部分行是DateTime类型,部分行是值为'DateTime.Null'的String类型(源于C#代码中定义的DateTime?可空类型) - 未配置显式字段映射时,ADF自动推断该字段为DateTimeOffset类型,导致所有值为
'DateTime.Null'的String类型行被跳过,报错信息为:Column 'ExpectedArrivalDate' contains an invalid value 'DateTime.Null' - 尝试通过JSON视图手动将源和Sink的该字段映射改为String类型,但运行后映射未生效,仍跳过相同行
- 临时解决方法:修改源表第一个实体的
ExpectedArrivalDate字段类型为String,删除ADF中的显式映射后运行,所有行可成功复制,该字段统一转为String类型
疑问
- 为什么ADF Copy Activity无法处理与首实体推断Schema不符的行?
- 是否存在无需修改源数据的解决方案?
原因分析
ADF Copy Activity的自动Schema推断机制默认基于源数据的前100行进行类型判定,如果首行或前几行的ExpectedArrivalDate字段是DateTime类型,就会将整个字段的类型锁定为DateTimeOffset(ADF对日期类型的标准映射)。后续行中出现的String类型值不符合已推断的类型,会被判定为无效值,触发默认的跳过或报错逻辑,这是ADF为保证数据类型一致性的默认校验行为。
另外,手动修改JSON映射后未生效,大概率是因为源数据集开启了自动Schema检测——ADF会在运行时重新推断字段类型,覆盖手动设置的映射规则。
无需修改源数据的解决方案
方案1:强制源数据集以String类型读取目标字段
- 编辑源数据集,关闭自动Schema检测功能
- 在源数据集的Schema定义中,手动将
ExpectedArrivalDate字段的类型设置为String - 回到Copy Activity的映射界面,确认源和Sink的该字段均映射为String类型(UI界面设置比直接改JSON更不易被覆盖)
- 运行Copy Activity,此时所有行的该字段会以String类型读取和写入,
'DateTime.Null'字符串将被正常保留
方案2:使用ADF数据流(Data Flow)替代Copy Activity
如果需要更灵活的类型处理逻辑,推荐使用数据流:
- 添加源转换,连接到源存储账户的目标表
- 添加派生列转换,对
ExpectedArrivalDate字段做统一处理:- 用条件表达式判断字段类型,将DateTime类型转为String,同时保留
'DateTime.Null'字符串,示例表达式:iif(isDate(ExpectedArrivalDate), toString(ExpectedArrivalDate), ExpectedArrivalDate)
- 用条件表达式判断字段类型,将DateTime类型转为String,同时保留
- 添加接收器转换,连接到目标存储账户的表,确认字段映射正确
- 运行数据流,该方式可精准处理混合类型字段,不受首行类型推断的限制
内容的提问来源于stack exchange,提问作者Gellert Kovacs
相关产品推荐
相关产品推荐

