Dataframe groupBy,根据聚合函数的结果得到相应的行值

时间:2017-02-21 17:29:27

标签: scala apache-spark dataframe

我有数据框,名称为c1,c2,c3,c4。我想将它分组在一个列上,并在其他列上使用agg函数,例如min / max / agg ..等,并根据agg函数的结果获取相应的其他列值

示例:

c1  c2  c3  c4
1   23  1   1
1   45  2   2
1   91  3   3
1   90  4   4
1   71  5   5
1   42  6   6
1   72  7   7
1   44  8   8
1   55  9   9
1   21  0   0

应该结果:

c1  c2  c3  c4
1   91  3   3

让dataframe为df

df.groupBy($"c1").agg(max($"c2"), ??, ??)

有人可以请求帮助应该去的地方吗?

我知道使用RDD解决这个问题。想要探索是否可以使用Dataframe / Dataset api以更简单的方式解决这个问题

1 个答案:

答案 0 :(得分:2)

您可以分两步完成此操作:

  • 计算汇总数据框;

  • 将数据帧与原始数据帧连接起来并根据条件进行过滤;

这样:

val maxDF = df.groupBy("c1").agg(max($"c2").as("maxc2"))
// maxDF: org.apache.spark.sql.DataFrame = [c1: int, maxc2: int]

df.join(maxDF, Seq("c1")).where($"c2" === $"maxc2").drop($"maxc2").show
+---+---+---+---+
| c1| c2| c3| c4|
+---+---+---+---+
|  1| 91|  3|  3|
+---+---+---+---+