【发布时间】:2018-08-17 10:04:05
【问题描述】:
BigQuery 方便地包含 FARM_FINGERPRINT 函数。这是此功能的documentation 的摘录:
说明
使用开源 FarmHash 库中的 Fingerprint64 函数计算 STRING 或 BYTES 输入的指纹。对于特定输入,此函数的输出永远不会改变。
返回类型
INT64
请注意,返回类型为 INT64,在 bigquery 中为 a 64-bit signed int。
但是,如果我们查看the actual implementation of Fingerprint64,我们可以在头文件中看到它返回一个无符号 64 位整数。
问题 64 位无符号整数的最大值是 64 位有符号整数的两倍。因此,有一半时间,FARM_FINGERPRINT 将生成一个超出 BigQuery INT64 可表示范围的输出。在这种情况下,BigQuery 会做什么?它以某种方式将Fingerprint64 的输出转换为适合有符号整数的范围,但文档没有说明如何。
这样做的一种方法是让值溢出,导致值环绕到带符号整数的负范围内。但是,由于Fingerprint64 是一个可移植函数,这似乎是一个糟糕的设计,因为它在 BigQuery 中的输出与其他系统中的标准输出不同。如果存在这种差异,至少应该用一个大的警告来记录它!
【问题讨论】:
-
玩弄 FARM_FINGERPRINT64,看起来 bigquery 只是让值溢出并“环绕”到整数范围的负侧。
-
文档可以说有一个有符号的 64 位整数有一个
static_cast。 -
文档说它使用了“来自开源 FarmHash 库的 Fingerprint64 函数”,但并不是说它就是那个函数。而且由于 BigQuery 中的 int64 是有符号的,它不能具有与 uint64(无符号)相同的值,因此应用 Two's complement 以使它们适合将第一位作为有符号大。 (正如您所解释的,@ElliottBrossard 和 Conrad Lee)
-
我将提供您关于改进相关文档的反馈,并将我的评论发布为社区 wiki :)
标签: google-bigquery