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

Pyspark如何将DataFrame的Struct字段除指定字段外转为值数组

解决步骤

你现有代码的核心问题是三个:

  1. 字段引用路径不完整,Spark会在根层级查找h_xx字段导致报错
  2. 未对h_xx字段按后缀数字排序,直接取schema返回的字段顺序是字符串排序,会出现h_10排在h_2前面的问题,数组顺序不符合预期
  3. 没有保留要求的stat_chiamate外层结构体结构

完整实现代码

from pyspark.sql import functions as F

# 第一步:提取chiamate_ricevute下所有h_开头的字段名
h_fields = [
    f.name 
    for f in df.schema["stat_chiamate"].dataType["chiamate_ricevute"].dataType.fields 
    if f.name.startswith("h_")
]
# 按后缀数字排序,保证数组顺序是h_0到h_23
h_fields_sorted = sorted(h_fields, key=lambda x: int(x.split("_")[1]))

# 第二步:重构stat_chiamate结构体
df = df.withColumn(
    "stat_chiamate",
    F.struct(
        F.array(*[
            F.col(f"stat_chiamate.chiamate_ricevute.{field}") 
            for field in h_fields_sorted
        ]).alias("chiamate_ricevute")
        # 如果stat_chiamate下还有其他需要保留的字段,在这行后面补充即可,格式为:F.col("stat_chiamate.xxx").alias("xxx")
    )
)

验证结果

执行后可通过以下代码查看schema是否符合要求:

df.select("stat_chiamate").printSchema()

输出应该为:

root
 |-- stat_chiamate: struct (nullable = false)
 |    |-- chiamate_ricevute: array (nullable = false)
 |    |    |-- element: string (containsNull = true)

数组的元素顺序严格对应h_0到h_23的取值,且自动排除了n_totale字段。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 16:24:03