Impala vs SparkSQL:内置函数转换:fnv_hash

时间:2017-01-25 18:26:25

标签: apache-spark pyspark apache-spark-sql impala

我在Impala中使用fnv_hash将一些字符串值转换为数字。现在我正在迁移到Spark SQL,我可以使用Spark SQL中的类似功能吗?几乎1-1函数映射字符串值到数字应该工作。谢谢!

1 个答案:

答案 0 :(得分:1)

不幸的是,Spark不提供直接替换。虽然内置o.a.s.sql.functions.hash / pyspark.sql.functions.hash使用MurmurHash 3 which should have comparable properties with the same hash size,但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 expression是公共的,所以你需要的只是一个简单的包装器。大概是这样的:

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]