我有数据框,名称为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以更简单的方式解决这个问题
答案 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|
+---+---+---+---+