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| +---+-----------+-----------+-----------+
操作说明
groupBy("id"):将数据集按id分组,这是构建行索引的基础pivot("date"):Spark会自动识别date字段的所有唯一值,并将它们作为新的列名,这是长表转宽表的核心操作agg(first("price")):由于每个(id, date)对只有一条数据,聚合操作只是提取该组合对应的价格值,不会改变数据本身na.fill("-"):处理透视后缺失的单元格,将空值替换为指定的'-'符号
内容的提问来源于stack exchange,提问作者Chandan Bhattad
相关产品推荐
相关产品推荐

