首页 > 解决方案 > 如何在scala中获取groupBy未使用的每列的最大值

问题描述

df对于我 用于 groupBy 操作的 spark 数据(col1, col2, col3)框,即 ,等df.groupBy(col1, col2, col3)中的其他列。那么我应该如何从每个组中获取最大值为 的表?我期待一些操作,如:df col4col5col4col5(col1, col2, col3)

df.groupBy(col1, col2, col3).max(...)

结果应该看起来像

+---------+--------+---------+----+---+
|col1     |col2    |col3_max |col4_max|
+---------+--------+---------+----+---+
|1021     |a       |  .      | .      |
|1000     |b       |  .      | .      |
|1011     |c       |  .      | .      |
+---------+--------+---+----+---+-----+

标签: scalaapache-sparkapache-spark-sql

解决方案


你所拥有的应该工作。我只是通过打开一个spark-shell.

scala> val df = Seq((1,2,3,4,5,6), (1,2,3,9,3,2), (2,3,3,1,1,1).toDF("col1", "col2", "col3", "col4", "col5", "col6")
df: org.apache.spark.sql.DataFrame = [col1: int, col2: int ... 4 more fields]
scala> df.groupBy("col1", "col2", "col3").max("col4", "col5", "col6").show()
+----+----+----+---------+---------+---------+
|col1|col2|col3|max(col4)|max(col5)|max(col6)|
+----+----+----+---------+---------+---------+
|   2|   3|   3|        1|        1|        1|
|   1|   2|   3|        9|        5|        6|
+----+----+----+---------+---------+---------+

如果您想要所有列而不命名它们,您可以执行以下操作,但您需要过滤掉 col1、col2 和 col3 的最大值:

scala> df.groupBy("col1", "col2", "col3").max().show()
+----+----+----+---------+---------+---------+---------+---------+---------+
|col1|col2|col3|max(col1)|max(col2)|max(col3)|max(col4)|max(col5)|max(col6)|
+----+----+----+---------+---------+---------+---------+---------+---------+
|   2|   3|   3|        2|        3|        3|        1|        1|        1|
|   1|   2|   3|        1|        2|        3|        9|        5|        6|
+----+----+----+---------+---------+---------+---------+---------+---------+

推荐阅读