You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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类型

疑问

  1. 为什么ADF Copy Activity无法处理与首实体推断Schema不符的行?
  2. 是否存在无需修改源数据的解决方案?

原因分析

ADF Copy Activity的自动Schema推断机制默认基于源数据的前100行进行类型判定,如果首行或前几行的ExpectedArrivalDate字段是DateTime类型,就会将整个字段的类型锁定为DateTimeOffset(ADF对日期类型的标准映射)。后续行中出现的String类型值不符合已推断的类型,会被判定为无效值,触发默认的跳过或报错逻辑,这是ADF为保证数据类型一致性的默认校验行为。

另外,手动修改JSON映射后未生效,大概率是因为源数据集开启了自动Schema检测——ADF会在运行时重新推断字段类型,覆盖手动设置的映射规则。

无需修改源数据的解决方案

方案1:强制源数据集以String类型读取目标字段

  1. 编辑源数据集,关闭自动Schema检测功能
  2. 在源数据集的Schema定义中,手动将ExpectedArrivalDate字段的类型设置为String
  3. 回到Copy Activity的映射界面,确认源和Sink的该字段均映射为String类型(UI界面设置比直接改JSON更不易被覆盖)
  4. 运行Copy Activity,此时所有行的该字段会以String类型读取和写入,'DateTime.Null'字符串将被正常保留

方案2:使用ADF数据流(Data Flow)替代Copy Activity

如果需要更灵活的类型处理逻辑,推荐使用数据流:

  1. 添加源转换,连接到源存储账户的目标表
  2. 添加派生列转换,对ExpectedArrivalDate字段做统一处理:
    • 用条件表达式判断字段类型,将DateTime类型转为String,同时保留'DateTime.Null'字符串,示例表达式:
      iif(isDate(ExpectedArrivalDate), toString(ExpectedArrivalDate), ExpectedArrivalDate)
      
  3. 添加接收器转换,连接到目标存储账户的表,确认字段映射正确
  4. 运行数据流,该方式可精准处理混合类型字段,不受首行类型推断的限制

内容的提问来源于stack exchange,提问作者Gellert Kovacs

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.11 02:02:43