如何为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)的主要内容,如果未能解决你的问题,请参考以下文章

如何为数据库中找到的每一行/记录生成一个链接,以便在单击时填充表单?

在反应状态引擎中,如何为结果表的每一行生成唯一的 UUID?

如何为网格面板中的每一行创建一个表单:extjs

如何为表格的每一行放置一个表格

如何为 LIstView 中的每一行添加一个按钮?

如何为表格中的每一行制作一个接受按钮?