我正在尝试使用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_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|
#+---+---+--------------------------------+