如何为rdd的每一行生成一个哈希? (PYSPARK)
Posted
技术标签:
【中文标题】如何为rdd的每一行生成一个哈希? (PYSPARK)【英文标题】:How to generate a hash for each row of rdd? (PYSPARK) 【发布时间】:2016-10-31 15:08:48 【问题描述】:如问题中所述,我正在尝试为 RDD 的每一行生成一个哈希。出于我的目的,我不能使用 zipWithUniqueId()
方法,我需要所有列的一个哈希,用于 RDD 的每一行。
for row in DataFrame.collect():
return hashlib.sha1(str(row))
我知道这是最糟糕的方式,迭代到 rdd,但我是 pyspark 的初学者。然而问题是:我为每一行获得相同的哈希值。我尝试使用强抗碰撞哈希函数,但它太慢了。 有什么办法可以解决这个问题吗? 在此先感谢:)
【问题讨论】:
【参考方案1】:查看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))
【讨论】:
您好,如何根据多列生成哈希值?除了my_col
,我们可以在这里使用多个列名吗?我试过了:df2= df.withColumn('hash_id', f.sha2(f.struct(f.col('col1'),f.col('col2')), 256))
似乎不起作用..【参考方案2】:
您的散列方法似乎没问题。你确定你以正确的方式使用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']
【讨论】:
以上是关于如何为rdd的每一行生成一个哈希? (PYSPARK)的主要内容,如果未能解决你的问题,请参考以下文章
如何为数据库中找到的每一行/记录生成一个链接,以便在单击时填充表单?