我想使用 ADF 中的复制活动将表从一个存储帐户复制到另一个存储帐户。我只需要我的表的一个简单副本,最好与源表 100% 相同。
源表中有一个名为 ExpectedArrivalDate 的字段,它可以在行/实体之间更改其数据类型。在某些实体上,该字段是 DateTime,在其他实体上,该字段是 String。
原因是实体是通过 C# 代码操作的,其中该字段的数据类型是 DateTime? (即可为空的日期时间)。
当我在未定义显式映射的情况下执行复制活动时,ADF 自动确定 ExpectedArrivalDate 列的数据类型为 DateTimeOffset,这会导致跳过 ExpectedArrivalDate 类型为 String(示例值:“DateTime.Null”)的所有实体在复制操作期间。根据错误日志,这些实体被跳过,因为在源表中,找到了字符串值“DateTime.Null”,而不是有效的 DateTime,并且 ADF 认为这与架构不兼容。
生成的错误日志示例:
级别 | 操作名称 | 留言 |
---|---|---|
警告 | 表格行跳过 | “ExpectedArrivalDate”列包含无效值“DateTime.Null”。 |
如果我尝试使用“导入架构”按钮在 ADF 中定义显式映射,我会看到生成以下映射:
无法从 UI 更改数据类型,因此我转到管道的 JSON 视图,并将其手动更改为源和接收器的字符串。
再次运行管道,仍然会跳过相同的行,并且忽略我更改的数据类型映射。
结果:所有行都被复制到接收器,所有实体上的 ExpectedArrivalDate 列的数据类型都将转换为 String,即使源表中的某些实体上的数据类型是 DateTime。
为什么 ADF Copy 活动无法处理架构与从表的第一个实体推断的架构不同的行?有没有办法在不手动更改源表中数据的情况下完成这项工作?
ADF 复制活动使用架构推断来确定源数据的架构。当复制活动遇到具有与推断架构不同架构的行时,它会跳过该行。此行为是设计使然,以确保数据正确复制到目标。
由于您需要实现数据转换逻辑来动态处理这种情况,我建议使用映射数据流而不是复制活动
我联系了 Microsoft 支持,他们告诉我 ADF 不支持我的用例场景。作为解决方法,他们建议将我的复制活动分成两部分。
这样,无论实体之间列的数据类型是否发生变化,所有数据都将被复制。不幸的是,这会导致额外的执行时间(2 个复制活动而不是 1 个),并且作为副作用,所有列中的所有数据都会转换为字符串。