我正在尝试向数据框中添加一列,该列将包含另一列的哈希。
我找到了以下文档:
https://spark.apache.org/docs/2.3.0/api/sql/index.html#hash
并尝试了此:
import org.apache.spark.sql.functions._
val df = spark.read.parquet(...)
val withHashedColumn = df.withColumn("hashed", hash($"my_column"))
但是该hash()
使用的哈希函数是什么?那是murmur
,sha
,md5
还是其他东西吗?
我在此列中获得的值是整数,因此此处的值范围可能是[-2^(31) ... +2^(31-1)]
。
我可以在这里获得长期价值吗?我可以代替字符串哈希吗?
如何为此指定一种具体的哈希算法?
我可以使用自定义哈希函数吗?
答案 0 :(得分:1)
如果你想要一个长散列,在 spark 3 中有 xxhash64
函数:https://spark.apache.org/docs/3.0.0-preview/api/sql/index.html#xxhash64。
您可能只需要正数。在这种情况下,您可以使用 hash
和 sum Int.MaxValue
as
df.withColumn("hashID", hash($"value").cast(LongType)+Int.MaxValue).show()
答案 1 :(得分:0)
这是基于源代码的Murmur。
/**
* Calculates the hash code of given columns, and returns the result as an int column.
*
* @group misc_funcs
* @since 2.0.0
*/
@scala.annotation.varargs
def hash(cols: Column*): Column = withExpr {
new Murmur3Hash(cols.map(_.expr))
}