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

PySpark展平含结构体数组的Parquet文件问题求助

解决Spark中展平数组嵌套Struct的问题

正确实现代码

from pyspark.sql.functions import explode, col

# 读取Parquet文件
df = spark.read.parquet(file)

# 1. 展开Resources数组,每个struct元素生成一行
output_df = df.withColumn("resource", explode(col("Resources")))

# 2. 从展开的struct中提取RId和RVal字段
output_df = output_df.withColumn("RId", col("resource.RId")) \
                     .withColumn("RVal", col("resource.RVal"))

# 3. 删除冗余列
output_df = output_df.drop("Resources", "resource")

# 验证结果
output_df.show()
output_df.printSchema()

问题分析与步骤解释

你之前的代码无法实现预期效果,核心原因是没用到explode函数:

  • 直接取Resources[0]/Resources[1]只能拿到数组前两个元素,没法遍历所有元素生成多行;
  • 错误使用.val是因为混淆了字段名——struct里的字段是RId和RVal,不是val。

具体步骤说明:

  1. explode展开数组:explode(col("Resources"))会把数组类型的Resources列拆分成多行,每个数组元素对应一行,生成的临时列resource是单个struct类型。
  2. 提取struct字段:通过resource.RId和resource.RVal直接访问struct内部的字段,生成独立的列。
  3. 清理冗余列:删除原数组列Resources和临时struct列resource,得到目标扁平结构。

验证结果

执行后output_df.show()会输出你预期的表格:

+----+----+---+----+
| TID| EID|RId|RVal|
+----+----+---+----+
|"T1"|"E1"|"a"|10.0|
|"T1"|"E1"|"b"|20.0|
|"T1"|"E1"|"c"|30.0|
|"T2"|"E2"|"d"| 0.0|
|"T2"|"E2"|"e"| 0.2|
+----+----+---+----+

output_df.printSchema()会输出目标Schema:

root
 |-- TID: string (nullable = true)
 |-- EID: string (nullable = true)
 |-- RId: string (nullable = true)
 |-- RVal: double (nullable = true)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.04 13:45:08