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。
具体步骤说明:
- explode展开数组:
explode(col("Resources"))会把数组类型的Resources列拆分成多行,每个数组元素对应一行,生成的临时列resource是单个struct类型。 - 提取struct字段:通过
resource.RId和resource.RVal直接访问struct内部的字段,生成独立的列。 - 清理冗余列:删除原数组列
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
相关产品推荐
相关产品推荐

