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

Spark DataFrame如何获取每列的最大值?

解决Spark DataFrame获取所有列最大值的问题

嗨,这个需求其实很常见,我来给你几个实用的方案,不管你的DataFrame有多少列、列名是什么都能轻松搞定~

方法一:一次性聚合所有列(推荐,性能最优)

这种方法只需要触发一次Spark作业,就能计算出所有列的最大值,非常适合大数据量的场景:

import org.apache.spark.sql.functions.{col, max}

// 1. 为每一列生成对应的max聚合表达式,同时保留原列名作为别名
val maxAggExprs = df.columns.map(columnName => max(col(columnName)).alias(columnName))

// 2. 执行聚合操作,得到只包含一行结果的DataFrame
val maxValuesRow = df.agg(maxAggExprs.head, maxAggExprs.tail: _*).head()

// 3. 将结果转换为Map,方便通过列名快速获取最大值
val maxValuesMap = df.columns.zip(maxValuesRow.toSeq).toMap

使用示例

比如你想获取名为age的列的最大值,直接通过Map取值即可:

val ageMax = maxValuesMap("age")

这个方法的优势在于只扫描一次数据,Spark会自动优化聚合逻辑,性能远优于逐列计算。

方法二:遍历列名逐列计算

如果你需要对不同列做额外的自定义处理(比如不同列的类型转换逻辑不同),可以用这种逐列遍历的方式:

import org.apache.spark.sql.functions.max
import scala.collection.mutable.Map

// 初始化一个Map来存储列名和对应的最大值
val maxValues = Map[String, Any]()

// 遍历所有列名,逐个计算最大值
df.columns.foreach { columnName =>
  val row = df.agg(max(columnName)).head()
  // 这里用Any是因为不同列可能有不同数据类型(Int、Double等)
  maxValues.put(columnName, row.get(0))
}

注意事项

  • 这种方法会对每一列触发一次Action操作,如果你的DataFrame列很多,会多次扫描数据,性能不如第一种方法,所以优先推荐方法一。
  • 如果你明确知道列的数据类型,可以替换Any为具体类型(比如Int、Double),或者用模式匹配处理多种类型:
df.columns.foreach { columnName =>
  df.agg(max(columnName)).head() match {
    case Row(maxVal: Int) => maxValues.put(columnName, maxVal)
    case Row(maxVal: Double) => maxValues.put(columnName, maxVal)
    // 可以根据实际需求添加更多类型的case
  }
}

内容的提问来源于stack exchange,提问作者Hoori M.

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 07:46:33