使用 HASH 作为 Snowflake 中的备用维度键?

Gav*_*son 2 json snowflake-cloud-data-platform

(代表 Snowflake 客户提交)

……………………

我想创建一个以特征作为 JSON 属性的维度。

我正在考虑使用 HASH 来唯一标识我的行,包括 JSON 列。

我预计该维度中有几百万行。

Snowflake 文档 ( https://docs.snowflake.net/manuals/sql-reference/functions/hash.html ) 表示 HASH 可能会产生 40 亿行或更多的重复项...并警告不要使用 HASH 作为键...

当只有几百万行成员时,使用哈希值作为键是一种合理的方法吗?

……………………

有什么想法、替代建议或可能的解决方法吗?谢谢。

小智 5

这是一个有趣的问题。

\n\n

假设哈希确实是随机的,计算碰撞概率实际上是生日问题的延伸。我们可以将概率近似为

\n\n

p(碰撞) \xe2\x89\x88 1 - e^(-(n^2)/2d))

\n\n

其中 n 是值的数量,d 是域的大小。将 2^32(40 亿)代入 n 中,将 2^64 代入 d 中,我们得到 p \xe2\x89\x88 .39,因此发生碰撞的可能性相当高。

\n\n

但如果n只有几百万,这个概率就低得多。例如,对于 n = 10,000,000,我们得到 p \xe2\x89\x88 .0000027。这听起来很安全,但显然存在一些风险。这假设散列是完美的,所以你可能应该稍微提高这个概率。

\n\n

您可以尝试更长、更标准的哈希值,例如Snowflake 支持的SHA-2 。总是存在一些冲突的风险,但如果你使哈希足够长,这将变得非常小\xe2\x80\x94,这就是你对哈希的所有期望。

\n\n

不过,散列的更好替代方法可能是将 JSON 放在单独的表中,并使用自动增量为每个记录分配真正的唯一标识符。然后您可以使用此密钥加入。如果你做得正确,它应该总是有效,并且我希望 join perf 也能更好。

\n