我正在使用 Impala 中的fnv_hash
将一些字符串值转换为数字。现在我正在迁移到Spark SQL,Spark SQL中是否有类似的功能可供我使用?将字符串值映射到数字的几乎 1-1 函数应该有效。谢谢!
Spark不提供直接替换。虽然内置o.a.s.sql.functions.hash
/pyspark.sql.functions.hash
使用MurmurHash 3,它应该具有具有相同哈希大小的可比属性,但Spark使用32位哈希(与Impala中的64位fnv_hash
相比)。如果这是可以接受的,只需导入hash
就可以了:
from pyspark.sql.functions import hash as hash_
df = sc.parallelize([("foo", ), ("bar", )]).toDF(["foo"])
df.select(hash_("foo"))
DataFrame[hash(foo): int]
如果你需要更大的,你可以看看 XXH64
.它不是使用 SQL 函数直接公开的,但 Catalyst 表达式是公共的,所以你所需要的只是一个简单的包装器。大致是这样的:
package com.example.spark.sql
import org.apache.spark.sql.Column
import org.apache.spark.sql.catalyst.expressions.XxHash64
object functions {
def xxhash64(cols: Column*): Column = new Column(
new XxHash64(cols.map(_.expr))
)
}
from pyspark import SparkContext
from pyspark.sql.column import Column, _to_java_column, _to_seq
def xxhash64(*cols):
sc = SparkContext._active_spark_context
jc = sc._jvm.com.example.spark.sql.functions.xxhash64(
_to_seq(sc, cols, _to_java_column)
)
return Column(jc)
df.select(xxhash64("foo"))
DataFrame[xxHash(foo): bigint]