创建 Spark 行的 128 位哈希,存储为新列

Posted

技术标签:

【中文标题】创建 Spark 行的 128 位哈希,存储为新列【英文标题】:Create 128 bit hash of Spark row, store as new column 【发布时间】:2018-07-13 14:34:27 【问题描述】:

我需要在 dataFrame 中添加一列,该列是每一行的哈希值。目标是使用此哈希来唯一标识此行。我将有超过 100,000,000 行,这就是为什么哈希需要这么大。我知道内置的 spark 哈希,但不幸的是它只有 32 位,并且会导致大量的哈希冲突。我怎样才能做到这一点?

【问题讨论】:

创建一个接受多个参数(每列一个)的 UDF 函数,计算 128 位哈希并返回它。使用withColumn() 调用该函数。 UDF 示例:***.com/a/44971087/215945 【参考方案1】:

您可以使用内置的 md5 函数,因为它是 128 位的。但它不接受多个参数,因此必须将 concat 值放在一起。还需要处理不同的数据类型和空值。

import org.apache.spark.sql.functions.col, md5, concat, cast, lit

val tab_w_hash = tab.withColumn("hash128", md5(concat(tab.columns.map(x => coalesce(col(x).cast("string"),lit(""))) : _*)))

【讨论】:

以上是关于创建 Spark 行的 128 位哈希,存储为新列的主要内容,如果未能解决你的问题,请参考以下文章

以键为新列重塑键值对的火花数据框

提取模型摘要并将其存储为新列

如何在 pyspark 数据框中将变量值分配为新列值?

如何将 CSV 值与 pyspark 数据框中的单元格中的值分别分隔为新列及其值

Hive查询:根据条件选择一列,另一列值匹配某些特定值,然后将匹配结果创建为新列

Scala Spark Dataframe 创建一个新列,其中包含另一列的最大先前值和当前值