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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 14:09:04