正如问题所述,我试图为RDD的每一行生成一个哈希值。出于我的目的,我无法使用zipWithUniqueId()
方法,我需要为RDD的每一行提供所有列的一个哈希值。
for row in DataFrame.collect():
return hashlib.sha1(str(row))
我知道这是最糟糕的方式,迭代到rdd,但我是pyspark的初学者。但问题是:我为每一行获得相同的哈希值。我试图使用强大的抗冲突哈希函数,但它太慢了。 有什么方法可以解决这个问题吗? 在此先感谢:)
答案 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))