Spark Scala如何按ID合并DataFrame行并优先保留非空值
Spark Scala 按分组合并行优先保留非空值实现方案
核心实现思路
对分组键以外的所有列,使用first函数并开启忽略空值的配置,动态生成聚合逻辑,适配大量列的场景,同时兼容列全为空的情况。
代码实现
首先导入依赖的Spark SQL函数:
import org.apache.spark.sql.functions.{first, col}
执行分组聚合:
// 筛选出除分组键name之外的所有列,生成聚合表达式 val aggCols = df.columns.filter(_ != "name").map(colName => { // 第二个参数设为true表示跳过null值,取分组内第一个非空值,全为空则返回null first(col(colName), ignoreNulls = true).alias(colName) }) // 传入聚合表达式列表执行分组聚合 val resDf = df.groupBy("name").agg(aggCols.head, aggCols.tail: _*)
说明
- 该实现无需手动指定每一列的聚合规则,不管DataFrame有多少非分组列都可以直接使用
- 如果分组内某一列所有值都是null,聚合结果会自动返回null,符合需求
- 如果你需要按特定顺序取非空值(比如按某时间列排序后取最新的非空值),可以在分组前先对DataFrame按对应规则排序即可
内容的提问来源于stack exchange,提问作者jmarco10
相关产品推荐
相关产品推荐

