【问题标题】:Azure Data Flows md5 function does not recognize decimal values as uniqueAzure 数据流 md5 函数无法将十进制值识别为唯一值
【发布时间】:2021-02-10 23:29:03
【问题描述】:

我们使用 Azure 数据流在 Azure SQL 数据仓库中生成数据表的历史记录。在数据流中,我们在所有列上使用 md5 或 sha1 函数来生成唯一的行指纹以检测记录的变化,或识别已删除/新记录(相当标准的历史技术)。

对于某些数据表,我们有包含十进制值的列(例如数据类型 DECIMAL(18,1))。如果我查看在一个整数、一个文本和一个十进制列上生成的 md5 哈希,我希望这三行在 Azure 数据流中生成不同的哈希:

但是,这三行得到完全相同的哈希,这意味着我们无法检测到 [id] = 1 记录的字段 [value] 的变化。如果十进制值作为文本存储在数据库(或在 md5 函数中转换为字符串),哈希值不同:

这导致我们的一些历史记录表无法准确记录数据,只有小数列中的值发生了变化。

我的问题:有人知道这是否是 Azure 数据流的“设计”,还是需要 Microsoft 修复的错误?

【问题讨论】:

    标签: azure md5 checksum azure-data-factory-2 azure-data-flow


    【解决方案1】:

    是的,这是设计使然,同时也是一个错误。

    我也遇到过,我和这里的团队想出了与您相同的解决方法,但执行时间增加了一倍。

    在与 Microsoft 讨论了大约 1 小时后,我们发现:

    • 浮动不受影响
    • 指定精度和小数位数的数据类型会受到影响
    • md5 的行为是,最后一个是,将其四舍五入 Integer 并对其应用 md5。

    MD5 将为这些值返回相同的值:

    • 0
    • 0.1
    • 0.4

    以下值的行为相同:

    • 0.5
    • 0.6
    • 1

    将返回不同的哈希值:

    • 0.4
    • 0.9
    • 1.5
    • 2.5

    有人告诉我修复预计在 2 月进行。

    如果不使用像我这样的列函数 (byNames),您可以将值乘以以 10 为底的幂,并以指数为指数。

    这将比 toString 更快。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-07-23
      • 1970-01-01
      • 1970-01-01
      • 2021-11-10
      • 1970-01-01
      • 2016-12-25
      • 2012-03-08
      • 2013-03-18
      相关资源
      最近更新 更多