我用的是 fnv_hash 在 Impala 中把一些字符串值转换成数字。现在我正在迁移到sparksql,sparksql中是否有类似的函数可以使用?将字符串值Map到数字的几乎是1-1的函数应该可以工作。谢谢!
fnv_hash
r7s23pms1#
不幸的是,spark不提供直接替换。内置时 o.a.s.sql.functions.hash / pyspark.sql.functions.hash spark使用32位散列(与64位散列相比) fnv_hash 在 Impala )。如果这是可以接受的只是进口 hash 你可以走了:
o.a.s.sql.functions.hash
pyspark.sql.functions.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 器。大致是这样的:
XXH64
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]
1条答案
按热度按时间r7s23pms1#
不幸的是,spark不提供直接替换。内置时
o.a.s.sql.functions.hash
/pyspark.sql.functions.hash
spark使用32位散列(与64位散列相比)fnv_hash
在 Impala )。如果这是可以接受的只是进口hash
你可以走了:如果你需要更大的你可以看看
XXH64
. 它不是使用sql函数直接公开的,但是catalyst表达式是公共的,所以您只需要一个简单的 Package 器。大致是这样的: