繁体   English   中英

md5 不适用于 pyspark 中的复杂数据类型

[英]md5 is not working on complex data types in pyspark

我正在尝试在整行的 pyspark 中使用 md5 function 计算 hash 。 在 pyspark dataframe 中,我为少数列提供了多种复杂数据类型。

for e.g :  col: array (nullable = true)
 |    |-- element: struct (containsNull = true)

 for e.g :  col: array (nullable = true)
 |    |-- element: array (containsNull = true)

当我尝试在整行上计算 md5 时,md5 会引发错误并显示以下消息:

**`col`' is of array<array<string>> type. argument 28 requires (array<string> or string) type, however, '`col`' is of array<array<string>> type**

计算md5的代码:

def prepare_data_md5(data):
    """ Prepare the data with md5 column.

    :param data: input DataFrame object
    :return: output DataFrame object
    """
    return data.withColumn("hash", md5(concat_ws(*data.columns)))

1.是否还有其他一些 function 可以用于 hash 并且也适用于复杂数据类型? 2. pyspark 或 python 中是否有一些库可用于展平复杂数据类型,以便我可以在展平数据帧上计算 md5?

我不认为有一些可用的 function 可以计算复杂类型的 hash。

如果您有数组和字符串列,则使用concat_wsarray_concat将复杂类型转换为字符串,然后应用md5

Example:

df.show()
#+---+------+
#| id|   arr|
#+---+------+
#|  a|[1, 2]|
#|  b|[3, 4]|
#+---+------+

from pyspark.sql.functions import *

df.withColumn("tmp",concat_ws(",",col("arr"))).\
withColumn("new",md5(concat_ws(",",col("id"),array_join(col("arr"),",")))).\
drop("tmp").\
show(10,False)
#+---+------+--------------------------------+
#|id |arr   |new                             |
#+---+------+--------------------------------+
#|a  |[1, 2]|9f357697a277b1e5a8315035e7d95984|
#|b  |[3, 4]|578bec981ad992ddb641a45969babab1|
#+---+------+--------------------------------+

#dynamic way

df1=df.withColumn("arr",array_join(col("arr"),","))

df1.withColumn("md5",md5(concat_ws(",",*[col(x) for x in df1.columns]))).show(10,False)
#+---+---+--------------------------------+
#|id |arr|md5                             |
#+---+---+--------------------------------+
#|a  |1,2|9f357697a277b1e5a8315035e7d95984|
#|b  |3,4|578bec981ad992ddb641a45969babab1|
#+---+---+--------------------------------+

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM