Pyspark如何将DataFrame的Struct字段除指定字段外转为值数组
解决步骤
你现有代码的核心问题是三个:
- 字段引用路径不完整,Spark会在根层级查找
h_xx字段导致报错 - 未对
h_xx字段按后缀数字排序,直接取schema返回的字段顺序是字符串排序,会出现h_10排在h_2前面的问题,数组顺序不符合预期 - 没有保留要求的
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
相关产品推荐
相关产品推荐

