Hive vs Spark Hash函数产生不同的结果

时间:2017-11-21 13:20:10

标签: apache-spark hash hive

我有两个完全相同的工作。 一个位于Hive,另一个位于Spark。结果的唯一区别是其中一列是经过哈希处理的字符串。因此,调用hash()时,hive和Spark的结果会有所不同。

我确实理解使用了不同的库。 但我想知道(如果可能的话)如何配置Spark以产生与蜂巢中相同的结果?

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

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

2 个答案:

答案 0 :(得分:1)

我有同样的问题。我发现,蜂巢中的哈希使用Java函数:

Reproduce hive hash function in Python

另一方面,这是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)

不过,火花实现是基于hashCode的。 hashCode的问题在于它不是确定性的,这意味着它取决于使用它的JVM和系统。因此,虽然实现可能是正确的,但在蜂巢中散列了两个字符串,而spark可能会给出不同的结果。

Java, Object.hashCode() result constant across all JVMs/Systems?

答案 1 :(得分:1)