如何在PySpark中转置指定列(time与value)重构DataFrame?
PySpark DataFrame 实现time与value列的行转列
原始数据
year week date time value 2020 1 20201203 2:00 - 2:15 23.9 2020 1 20201203 2:15 - 2:30 45.87 2020 1 20201203 2:30 - 2:45 87.76 2020 1 20201203 2:45 - 3:00 12.87
期望输出
year week date 2:00 - 2:15 2:15 - 2:30 2:30 - 2:45 2:45 - 3:00 2020 1 20201203 23.9 45.87 87.76 12.87
解决方案
使用PySpark的groupBy+pivot组合即可实现这类行转列需求,这是处理宽表转换的标准方法:
from pyspark.sql import SparkSession from pyspark.sql.functions import first # 初始化SparkSession(若未初始化) spark = SparkSession.builder.appName("pivot_demo").getOrCreate() # 创建示例DataFrame(替换为你的实际数据源) data = [ (2020, 1, 20201203, "2:00 - 2:15", 23.9), (2020, 1, 20201203, "2:15 - 2:30", 45.87), (2020, 1, 20201203, "2:30 - 2:45", 87.76), (2020, 1, 20201203, "2:45 - 3:00", 12.87) ] df = spark.createDataFrame(data, ["year", "week", "date", "time", "value"]) # 执行行转列操作 pivoted_df = df.groupBy("year", "week", "date") \ .pivot("time") \ .agg(first("value")) # 查看结果 pivoted_df.show(truncate=False)
代码说明
- groupBy:指定转换后保留的分组列(year、week、date),确保这些列的组合在结果中每行唯一。
- pivot:指定要转置为新列的字段(time),该字段的所有唯一取值会成为结果表的新列名。
- agg(first("value")):因为每个分组+time组合仅对应一个value值,用
first直接提取即可;若存在重复数据,可根据需求替换为sum、avg等聚合函数。
内容的提问来源于stack exchange,提问作者Asma Damani
相关产品推荐
相关产品推荐

