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

PySpark中如何将Array(Struct)列转换为Array(Map)类型?

PySpark 将Array(Struct)转换为Array(Map)的正确实现

你当前代码的问题在于:直接引用arr_data.Id时,PySpark会提取数组中所有结构体的Id字段生成一个数组,最终create_map得到的是键对应数组值的结构,而非每个结构体独立转成Map。

要实现将数组中的每个Struct元素单独转换为Map,需要使用transform函数遍历数组中的每个元素,对单个Struct元素创建Map。

正确代码实现

import pyspark.sql.functions as f

# 使用transform遍历数组,将每个Struct元素转为Map
df = df.withColumn(
    "arr_data_map",
    f.transform(
        "arr_data",
        lambda x: f.create_map(
            f.lit("Id"), x["Id"],
            f.lit("Q_Id"), x["Q_Id"],
            f.lit("Q_Type"), x["Q_Type"]
        )
    )
)

# 查看结果
df.select("arr_data_map").show(truncate=False)

预期输出

对于第一条数据,arr_data_map的结果为:

[
    {'Id': '12a', 'Q_Id': 'uac', 'Q_Type': 'action'},
    {'Id': '', 'Q_Id': '', 'Q_Type': ''},
    {'Id': '76v', 'Q_Id': '', 'Q_Type': 'form'}
]

扩展:动态处理Struct字段(无需硬编码字段名)

如果你的Struct字段可能变化,不想硬编码字段名,可以通过获取Schema动态生成Map:

from pyspark.sql import types as t

# 获取arr_data中Struct的字段名
struct_fields = df.schema["arr_data"].dataType.elementType.fieldNames()

# 生成create_map的参数:交替的lit(字段名)和x[字段名]
map_args = []
for field in struct_fields:
    map_args.extend([f.lit(field), f.col(f"x.{field}")])

# 使用动态参数转换
df = df.withColumn(
    "arr_data_map",
    f.transform("arr_data", lambda x: f.create_map(*map_args))
)

内容的提问来源于stack exchange,提问作者i.n.n.m

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.01 05:40:05