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

标签 json snowflake-cloud-data-platform

(代表 Snowflake 客户提交)

........................

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

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

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

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

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

........................

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

最佳答案

这是一个有趣的问题。

假设哈希值确实是随机的,那么计算碰撞概率实际上是 birthday problem 的扩展。 。我们可以将概率近似为

p(碰撞) ≈ 1 - e^(-(n^2)/2d))

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

但如果n只有几百万,这个概率就低得多。例如,对于 n = 10,000,000,我们得到 p ≈ .0000027。这听起来很安全,但显然存在一些风险。这假设哈希值是完美的,因此您可能应该稍微提高该概率。

您可以尝试更长、更标准的哈希值,例如 SHA-2,Snowflake supports 。总是存在一些冲突的风险,但如果你让哈希值足够长,它就会变得非常小——这就是你对哈希值的所有期望。

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

关于json - 使用 HASH 作为 Snowflake 中的备用维度键?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58330244/

相关文章:

javascript - 使用包含的 json 数据重复附加的 html

asp.net-mvc - 将 JsonRequestBehavior 设置为 AllowGet 时可能会泄露什么 'sensitive information'

sql - 如何从表中抽取 10% 的数据?

sql - 按组提取最常见(计数最高)的条目

snowflake-cloud-data-platform - Snowflake 的 VALIDATION_MODE ='RETRUN_ERROR' 未正确验证文件

sql - 根据多列排除行

c++ - cpp中如何判断json是object还是array,如果object转成array?

json - Spring MVC 3.2 和 JSON ObjectMapper 问题

php - Zend Json 编码和在 javascript 中的使用

sql - 在将 LISTAGG 或 REGEXP_REPLACE 与 DISTINCT 函数结合使用时需要帮助