如何获得每列的最大值?

时间:2018-01-10 14:36:57

标签: scala apache-spark apache-spark-sql

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

SELECT n.id 
     , n.Name 
     , (SELECT s.SubName 
        FROM #sub s WHERE s.id = n.id
        FOR XML RAW('s'), TYPE
        ) 
FROM #name n
FOR XML RAW('n')

我不知道如何将val col = df.columns(0); val Row(maxValue: Int) = df.agg(max(col)).head(); 与我拥有的代码结合起来,以便我可以获得数据帧中每一列的最大值。 (我不知道数据框中有多少列以及列名是什么)

感谢。

1 个答案:

答案 0 :(得分:4)

当您希望集合(在本例中为列名称数组)转换为其他内容(在这种情况下 - 它们的最大值)时,

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

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

val row: Row = df.groupBy().max().head