【问题标题】:How to generate a hash for each row of rdd? (PYSPARK)如何为rdd的每一行生成一个哈希? (PYSPARK)
【发布时间】:2016-10-31 15:08:48
【问题描述】:

如问题中所述,我正在尝试为 RDD 的每一行生成一个哈希。出于我的目的,我不能使用 zipWithUniqueId() 方法,我需要所有列的一个哈希,用于 RDD 的每一行。

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

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

【问题讨论】:

    标签: hash row pyspark rdd


    【解决方案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']
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-07-27
      • 1970-01-01
      • 2015-01-06
      • 1970-01-01
      相关资源
      最近更新 更多