You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将PySpark DataFrame中的字典列拆分为多行?

解决方法

根据你的错误提示,flags列被解析成了struct类型,而explode仅支持数组(array)或映射(map)类型,因此需要先将struct转换为可展开的类型,再提取目标字段。

情况1:flags已被解析为struct类型(当前报错场景)

方法1(Spark 3.0+ 推荐)

利用to_map函数将struct直接转为map,再通过map_keys提取所有键,最后用explode展开:

from pyspark.sql import functions as F

# 基于你已有的extract DataFrame处理
result = extract.select(
    F.col("id"),
    F.explode(F.map_keys(F.to_map(F.col("flags")))).alias("flags")
)

方法2(兼容Spark 3.0以下版本)

如果你的Spark版本不支持to_map,可以动态遍历struct的字段生成map,再展开键:

from pyspark.sql import functions as F

# 获取flags struct的所有字段信息
struct_fields = extract.schema["flags"].dataType.fields
# 动态构建map(键为struct字段名,值为对应字段值)
map_col = F.create_map(*[F.lit(field.name), F.col(f"flags.{field.name}") for field in struct_fields])
# 展开map的键作为flags值
result = extract.select(
    F.col("id"),
    F.explode(F.map_keys(map_col)).alias("flags")
)

情况2:flags原始为JSON字符串(如果未提前解析)

如果你的flags列原本是JSON格式的字符串(如示例中的"{\"93\":true,...}"),可以先将其解析为map类型再处理,避免自动转为struct:

from pyspark.sql import functions as F

# 先把JSON字符串解析为map<string, boolean>
extract = data.select(
    F.col("properties.id"),
    F.from_json(F.col("flags"), F.map_type(F.stringType(), F.booleanType())).alias("flags")
)
# 展开map的键得到目标结果
result = extract.select(
    F.col("id"),
    F.explode(F.map_keys(F.col("flags"))).alias("flags")
)

为什么原方法报错?

explode函数的输入要求是array或map类型,而你的flags是struct类型(每个键对应一个struct字段),两者不兼容,因此必须先做类型转换。

内容的提问来源于stack exchange,提问作者abautista

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.09 10:20:37