Hive与Spark的哈希函数产生不同的结果

3

我有两个相同的工作,一个在Hive中,另一个在Spark中。唯一不同的是结果中的一列是被哈希过的字符串。因此,在调用hash()时,hive和Spark的结果不同。

我知道使用了不同的库,但我想知道(如果可能的话)如何配置Spark以产生与Hive相同的结果?

是否可以找出哈希函数(例如murmur3)并在两个引擎中使用它?

也许可以创建一个Spark udf来产生与hive hash()函数相同的结果?

2个回答

2
我有同样的问题。我找到的是Hive中哈希使用了Java函数:

在Python中复制Hive哈希函数

另一方面,这是Spark中哈希函数的实现:
def hash(*cols):
    """Calculates the hash code of given columns, and returns the result as an int column.

    >>> spark.createDataFrame([('ABC',)], ['a']).select(hash('a').alias('hash')).collect()
    [Row(hash=-757602832)]
    """
    sc = SparkContext._active_spark_context
    jc = sc._jvm.functions.hash(_to_seq(sc, cols, _to_java_column))
    return Column(jc)

然而,Spark的实现也是基于hashCode的。hashCode存在的问题在于它不是确定性的,这意味着它取决于使用它的JVM和系统。因此,尽管实现可能是正确的,在Hive和Spark中哈希的两个字符串可能会产生不同的结果。Java,Object.hashCode() 在所有JVM/系统上的结果是否恒定?


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接