[英]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_ws
和array_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.