ADF 复制活动会跳过具有与推断架构不同值的表存储行

问题描述 投票:0回答:2

我想使用 ADF 中的复制活动将表从一个存储帐户复制到另一个存储帐户。我只需要我的表的一个简单副本,最好与源表 100% 相同。

源表中有一个名为 ExpectedArrivalDate 的字段,它可以在行/实体之间更改其数据类型。在某些实体上,该字段是 DateTime,在其他实体上,该字段是 String。

  1. 日期时间
  2. 字符串

原因是实体是通过 C# 代码操作的,其中该字段的数据类型是 DateTime? (即可为空的日期时间)。

当我在未定义显式映射的情况下执行复制活动时,ADF 自动确定 ExpectedArrivalDate 列的数据类型为 DateTimeOffset,这会导致跳过 ExpectedArrivalDate 类型为 String(示例值:“DateTime.Null”)的所有实体在复制操作期间。根据错误日志,这些实体被跳过,因为在源表中,找到了字符串值“DateTime.Null”,而不是有效的 DateTime,并且 ADF 认为这与架构不兼容。

生成的错误日志示例:

级别 操作名称 留言
警告 表格行跳过 “ExpectedArrivalDate”列包含无效值“DateTime.Null”。

尝试添加显式数据类型映射

如果我尝试使用“导入架构”按钮在 ADF 中定义显式映射,我会看到生成以下映射:

无法从 UI 更改数据类型,因此我转到管道的 JSON 视图,并将其手动更改为源和接收器的字符串。

再次运行管道,仍然会跳过相同的行,并且忽略我更改的数据类型映射。

我找到的解决方法

  1. 转到表存储并编辑源表中的第一个实体,将 ExpectedArrivalDate 字段的数据类型从 DateTime 更改为 String。
  2. 删除 ADF 中复制活动的所有显式映射。
  3. 运行管道。

结果:所有行都被复制到接收器,所有实体上的 ExpectedArrivalDate 列的数据类型都将转换为 String,即使源表中的某些实体上的数据类型是 DateTime。

问题

为什么 ADF Copy 活动无法处理架构与从表的第一个实体推断的架构不同的行?有没有办法在不手动更改源表中数据的情况下完成这项工作?

azure azure-data-factory azure-table-storage
2个回答
1
投票

ADF 复制活动使用架构推断来确定源数据的架构。当复制活动遇到具有与推断架构不同架构的行时,它会跳过该行。此行为是设计使然,以确保数据正确复制到目标。

由于您需要实现数据转换逻辑来动态处理这种情况,我建议使用映射数据流而不是复制活动


0
投票

我联系了 Microsoft 支持,他们告诉我 ADF 不支持我的用例场景。作为解决方法,他们建议将我的复制活动分成两部分。

  1. 从源表复制到 Blob 存储中的 CSV 文件。
  2. 从 Blob 存储复制到目标表。

这样,无论实体之间列的数据类型是否发生变化,所有数据都将被复制。不幸的是,这会导致额外的执行时间(2 个复制活动而不是 1 个),并且作为副作用,所有列中的所有数据都会转换为字符串。

© www.soinside.com 2019 - 2024. All rights reserved.