Spark Scala多列透视及RSECT条件过滤问题求助
Spark Scala 多列透视+过滤实现方案
1. 过滤目标数据
先筛选出RSECT值介于1到6之间的记录:
val filteredDF = originalDF.filter(col("RSECT").between(1, 6))
2. 实现多列透视
原生pivot仅适配单列聚合场景,多列透视用when+聚合函数(如max/first)更灵活。假设数据按ID分组,需透视的指标列为VAL1、VAL2(替换为你实际的列名即可):
import org.apache.spark.sql.functions._ // 列出所有需要做透视的指标列 val targetCols = List("VAL1", "VAL2") // 生成每个指标对应不同RSECT的聚合表达式 val aggExpressions = targetCols.flatMap(colName => (1 to 6).map(rsect => max(when(col("RSECT") === rsect, col(colName))).alias(s"${colName}_R$rsect") ) ) // 分组聚合得到最终结果 val finalDF = filteredDF.groupBy("ID").agg(aggExpressions.head, aggExpressions.tail:_*)
关键说明
- 使用
max是因为每个ID+RSECT对应唯一指标值,max/first均可拿到正确结果,可根据你的数据特性选择 - 若存在多个分组键(如除
ID外还有其他列),将其全部加入groupBy参数即可 - 指标列较多时,直接扩展
targetCols列表,无需修改其他逻辑
内容的提问来源于stack exchange,提问作者Omar Bouzekri
相关产品推荐
相关产品推荐

