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

Apache Spark转换:如何通过Pivot将行值转为列头实现数据透视

实现Spark透视表转换的操作方案

要把你给出的长格式(id, date, price)数据集转换成以id为行索引、日期为列的透视表,你可以组合使用Apache Spark的以下几个Transformation操作:

  • groupBy():先按id字段分组,确保最终结果里每个id对应一行数据
  • pivot():指定date作为列维度,自动将date字段的所有唯一值转换为透视表的列名
  • agg():因为每个(id, date)组合只有一条记录,使用first()、max()或min()这类聚合函数都能准确提取对应价格(这里用first()最直观)
  • na.fill():最后把透视后出现的空值替换成'-',匹配你需要的输出格式

代码示例(PySpark)

from pyspark.sql import SparkSession
from pyspark.sql.functions import first

# 初始化Spark会话
spark = SparkSession.builder.appName("PivotDataset").getOrCreate()

# 构造原始数据集
raw_data = [
    (1, "2017-01-10", 100),
    (1, "2017-01-11", 110),
    (2, "2017-01-10", 100),
    (2, "2017-01-12", 120)
]
df = spark.createDataFrame(raw_data, schema=["id", "date", "price"])

# 执行透视转换
pivot_result = df.groupBy("id") \
                 .pivot("date") \
                 .agg(first("price")) \
                 .na.fill("-")

# 查看结果
pivot_result.show()

执行后得到的结果和你要求的格式一致:

+---+-----------+-----------+-----------+
| id|2017-01-10 |2017-01-11 |2017-01-12 |
+---+-----------+-----------+-----------+
|  1|        100|        110|          -|
|  2|        100|          -|        120|
+---+-----------+-----------+-----------+

操作说明

  1. groupBy("id"):将数据集按id分组,这是构建行索引的基础
  2. pivot("date"):Spark会自动识别date字段的所有唯一值,并将它们作为新的列名,这是长表转宽表的核心操作
  3. agg(first("price")):由于每个(id, date)对只有一条数据,聚合操作只是提取该组合对应的价格值,不会改变数据本身
  4. na.fill("-"):处理透视后缺失的单元格,将空值替换为指定的'-'符号

内容的提问来源于stack exchange,提问作者Chandan Bhattad

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 03:44:58