如何为rdd的每一行生成一个哈希? (PYSPARK)

时间:2016-10-31 15:08:48

标签: hash row pyspark rdd

正如问题所述,我试图为RDD的每一行生成一个哈希值。出于我的目的,我无法使用zipWithUniqueId()方法,我需要为RDD的每一行提供所有列的一个哈希值。

for row in DataFrame.collect():
    return hashlib.sha1(str(row))

我知道这是最糟糕的方式,迭代到rdd,但我是pyspark的初学者。但问题是:我为每一行获得相同的哈希值。我试图使用强大的抗冲突哈希函数,但它太慢了。 有什么方法可以解决这个问题吗? 在此先感谢:)

2 个答案:

答案 0 :(得分:3)

您的哈希方法似乎没问题。你确定你以正确的方式使用python吗?如果将提供的代码放入函数中,它将始终返回数据帧中第一行的哈希值,因为内部循环返回。

您可以通过从Dataframe转到RDD并执行映射来以分布式方式计算哈希值,例如:

>>> import hashlib
>>> numbers = spark.range(10)
>>> numbers.show()
+---+
| id|
+---+
|  0|
|  1|
|  2|
|  3|
|  4|
|  5|
|  6|
|  7|
|  8|
|  9|
+---+

>>> numbers.rdd.map(lambda row: hashlib.sha1(str(row)).hexdigest()).collect()
['ec0dbe879dee5ca3b0d5f80687993273213611c9', 
'd19469cfdac63a279b2068a989bebb8918af721a', 
'c5051bbf3ac45c49e29041b9bd840badd484fd94', 
'7916b1b00f01e1676a3ed7ff80e9614430c74e4d', 
'3ef92cd5a3abdbf996694ba08685676b26478121', 
'6e0820c8a947c2d0f53c2d2957e4d256f6e75f25', 
'2297e8b06e13cc79861aed7c919b5333dfe39049', 
'1b64fd47d48f2fc7d7d45a4c6e9b1958e973ab8c', 
'6e53b27c52c20e2fb2ffa5b3a1013c13fad21db7', 
'02d08951fde664abbbec94b37ab322e751c40e33']

答案 1 :(得分:3)

查看pyspark.sql.functions.sha2(col, numBits),它返回SHA-2系列哈希函数(SHA-224,SHA-256,SHA-384和SHA-512)的十六进制字符串结果

自Spark v1.5起可用

import pyspark.sql.functions as F
df2 = df.withColumn('my_col_hashed', F.sha2(F.col('my_col'), 256))