将 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] |
+-----------------------------------------------------------+
我在 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
:
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] |
+-----------------------------------------------------------+