将 PySpark 类地图字符串拆分为地图对象

Split PySpark Map-like string into Map Object

我在 PySpark 中有一列包含 dictionary/map-like 个存储为字符串的值。

示例值:

'{1:'Hello', 2:'Hi', 3:'Hola'}'
'{1:'Dogs', 2:'Dogs, Cats, and Fish', 3:'Fish & Turtles'}'
'{1:'Pizza'}'

我想将这些字符串转换成数组或映射,这样我就可以对它们使用 .explode() 函数为每个字典键项对创建一行。我会在每个逗号上使用 .split(),但由于某些值中包含逗号,因此这不起作用。

我正在使用存储在 udf 中的 ast.literal_eval() 函数,但是当我 运行 它作为感兴趣列上的 udf 时,它仍然 returns 一个字符串而不是一个地图类型对象。关于解决此问题的最佳方法有什么想法吗?

如果要使用 literal_eval:

,您需要将 return 类型指定为地图
from ast import literal_eval
import pyspark.sql.functions as F

df2 = df.withColumn('col', F.udf(literal_eval, 'map<int,string>')('col'))

df2.show(truncate=False)
+-----------------------------------------------------------+
|col                                                        |
+-----------------------------------------------------------+
|[1 -> Hello, 2 -> Hi, 3 -> Hola]                           |
|[1 -> Dogs, 2 -> Dogs, Cats, and Fish, 3 -> Fish & Turtles]|
|[1 -> Pizza]                                               |
+-----------------------------------------------------------+