【问题标题】:Retaining empty strings when using POLYBASE to copy data from Azure SQL db to Azure Synapse使用 POLYBASE 将数据从 Azure SQL db 复制到 Azure Synapse 时保留空字符串
【发布时间】:2021-09-23 03:16:13
【问题描述】:

我正在使用复制数据活动将数据从 Azure SQL 数据库复制到 Azure Synapse。我正在尝试使用 Polybase 作为复制方法。这适用于大多数表,但我有一个包含以下列的源表和目标表:

Fee DECIMAL(18,2) NULL,
FeeReason VARCHAR(500) NOT NULL

由于我无法控制的原因,我无法更改列以允许在 FeeReason 列中使用 NULL。在表中,如果 Fee 为 NULL,则 FeeReason 为空字符串。

当我尝试将表从 Azure SQL DB 复制到 Synapse 时,当该值为 NULL 时,我收到费用列的错误:

ErrorCode=FailedDbOperation, ......HadoopSqlException: Error converting data type VARCHAR to DECIMAL.....Detailed Message=Empty string can't be converted to DECIMAL.....

这个问题的解决方案是按照loading-to-decimal-column将“使用类型默认值”设置为false

但是,当值在源 (Azure DB) 中为空字符串时,进行此更改会导致在 Synapse 中的 FeeReason 值为 NULL。无论如何我可以将“使用类型默认值”设置为 False 仅用于十进制列?

对此我有一个非常肮脏的解决方案,它涉及在源数据库中创建一个名为 FeeReasonIsEmpty 的 BIT 列,并标记其中 FeeReason 实际上是一个空字符串的记录,一旦数据被复制过来,我就可以更新 NULL 值在相关的地方清空字符串。如果可能的话,我想避免这种情况,因为实际上我有多个表,其中包含多个十进制列和多个 varchar/nvarchar 列,其中包含需要保留的空字符串。这个肮脏的解决方案意味着我需要为每一个创建一个“IsEmpty”列,我真的不想这样做。 谢谢。

【问题讨论】:

    标签: azure-sql-database azure-data-factory azure-data-factory-2 azure-synapse polybase


    【解决方案1】:

    很遗憾,我们目前无法将 UseTypeDefault 设置控制为仅特定列。

    为避免您的问题,此时您必须选择源数据集中的位列选项。到目前为止,我试图找到解决方案,但到目前为止,似乎唯一的选择是为各个列创建 IsEmpty 列。

    注意:目前,ADF 中的 PolyBase 只接受与目标表中相同数量的列:Columns with default values

    我鼓励您将此案例添加为以下链接的反馈项。产品团队将密切关注那里的反馈并考虑将它们用于未来的发布:FeedBack

    【讨论】:

      猜你喜欢
      • 2021-04-10
      • 2020-06-23
      • 2021-05-06
      • 2023-03-28
      • 2020-07-25
      • 2021-10-18
      • 2020-12-13
      • 1970-01-01
      • 2016-11-24
      相关资源
      最近更新 更多