PySpark DataFrame重构与导出:Pivot操作失效求助
问题描述
我的DataFrame结构如下:
Attribute Values ID Brand Model -------------------------------------------- Colour Red 1 Sony xyz Energy F 2 Samsung abc Year 2020 1 Sony xyz Energy C 1 Sony xyz Colour Blue 2 Samsung abc
需要将其重构为如下结构:
Brand Model Colour Energy Year -------------------------------------------- Sony xyz Red C 2020 Samsung abc Blue F 2021 etc...
我尝试按ID分组并执行Pivot操作,但代码无法正常运行,当前代码如下:
import pandas as pd from pyspark.sql import SparkSession from pyspark.sql.types import StructType,StructField, StringType, IntegerType,BooleanType,DoubleType import pyspark spark = SparkSession.builder \ .master("local[1]") \ .appName("PySpark Read JSON") \ .getOrCreate() df = spark.read.json("examplell.json") df.printSchema() df.show() count = df.select('ID').distinct().count() df_pivot = df.groupBy('ID').pivot('Attribute').agg('Values') df_pivot.printSchema() df_pivot.show()
正确实现方案
问题出在两个核心点:一是分组仅使用ID,但最终结果需要保留Brand和Model,需将这两列加入分组;二是agg方法必须指定具体聚合函数,不能直接传入列名。
修改后的完整代码:
import pyspark.sql.functions as F from pyspark.sql import SparkSession spark = SparkSession.builder \ .master("local[1]") \ .appName("PySpark Pivot Example") \ .getOrCreate() # 读取JSON数据(确保文件路径和结构正确) df = spark.read.json("examplell.json") # 分组+Pivot+聚合逻辑 df_pivot = df.groupBy('ID', 'Brand', 'Model') \ .pivot('Attribute') \ .agg(F.first('Values')) # 展示转换后的结果 df_pivot.show()
关键细节说明
- 分组列选择:
Brand和Model与ID一一对应,加入groupBy后可确保最终结果保留这两列,符合目标结构要求。 - 聚合函数选择:这里使用
first是因为每个ID+Attribute组合仅对应一个有效值;若存在重复数据,可根据业务需求替换为max、min等其他聚合函数。 - 缺失值填充:若部分分组缺少某些
Attribute,结果会显示null,可通过fillna补充默认值,示例:# 为Year列填充默认值2021 df_pivot = df_pivot.fillna({'Year': '2021'})
内容的提问来源于stack exchange,提问作者Daniel
相关产品推荐
相关产品推荐

