如何获取每一列的最大值?

Hoo*_* M. 3 scala apache-spark apache-spark-sql

我想获得 Spark 中数据帧的每一列的最大值。我的代码仅适用于一列(例如第一列):

val col = df.columns(0);
val Row(maxValue: Int) = df.agg(max(col)).head();
Run Code Online (Sandbox Code Playgroud)

我不知道如何组合foreach我所拥有的代码,以便我可以获得数据框中每一列的最大值。(我不知道数据框中有多少列以及列名是什么)

谢谢。

Tza*_*har 5

foreach当您想要将集合(在本例中 - 列名数组)转换为其他内容(在本例中 - 它们的最大值)时,这很少是有用的解决方案。相反,使用map- 然后将结果传递给agg

import spark.implicits._
import functions._

val df = Seq((1,3), (3, 1), (2, 2)).toDF("a", "b")

// map columns into columns representing their maximums 
val maxCols: Array[Column] = df.columns.map(max)

// aggregate all at once (have to separate first from rest due to agg's signature):
val row: Row = df.agg(maxCols.head, maxCols.tail: _*).head
Run Code Online (Sandbox Code Playgroud)

编辑:正如@user8371915提醒我们的,有一个更短的版本:

val row: Row = df.groupBy().max().head
Run Code Online (Sandbox Code Playgroud)