md5不处理pyspark中的复杂数据类型



我正在尝试使用pyspark中的md5函数对整行计算哈希。在pyspark数据帧中,我有多个复杂的数据类型用于少数列。

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.有没有其他函数可以用于哈希,也适用于复杂的数据类型?2.pyspark或python中是否有一些库可用于扁平化复杂的数据类型,以便我可以在扁平化的数据帧上计算md5?

我不认为中有一些函数可以计算复杂类型的哈希。

如果有数组列和字符串列,则使用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|
#+---+---+--------------------------------+

最新更新