我有两个完全相同的工作。一个在Hive
,另一个在Spark
。结果的唯一区别是其中一列是经过哈希处理的字符串。所以,当调用hash()
时,hive和Spark的结果是不同的。
我明白使用了不同的库。但我想知道(如果可能的话)如何配置Spark以产生与蜂巢相同的结果?
是否有可能找出散列函数(例如murmur3
)并在两个引擎中使用它?
也许有可能创建一个Spark udf
来产生与hive hash()
函数相同的结果?
我也有同样的问题。我能找到的是hive中的hash使用java函数:
Reproduce hive hash function in Python
另一方面,这是spark中hash函数的实现:
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() result constant across all JVMs/Systems?