首页 > 解决方案 > 我将如何分组并提取 Scala 中该组的不同列的最高 N?

问题描述

嗨,最近如何?这是一个示例数据框..

  val team_df = Seq(("yankees","aaron judge",24),("yankees","giancarlo stanton",20),("yankees","brett gardner",11),("dodgers","cody bellinger",20),("dodgers","jock pederson",10),
    ("dodgers","justin turner",15)).toDF("team","player","hits")

这是表格格式的屏幕截图:

在此处输入图像描述

假设我想为每支球队返回一个数据框,其中包含每支球队命中率最高的 2 名球员的行(或 N 最高)。

因此,在这个玩具示例中,它应该返回一个带有 aaron Judge 24 和 gianarlo stanton 20 的洋基队的数据帧,以及一个带有 cody bellinger 20 和 justin Turner 15 的道奇队的数据帧。

谢谢,祝你有美好的一天!

标签: scalaapache-spark

解决方案


def findMultipleDF(df: DataFrame, NHighest:Int): Map[String, DataFrame] = {
  val map = Map[String, DataFrame]()
  val rankedDF = df.withColumn("Rank", rank().over(Window.partitionBy("team").orderBy($"hits".desc)))
  val count = df.groupBy("team").count().collect()
  count.map(x => {
    val tempDF = rankedDF.filter($"team" === x.get(0) && col("Rank").leq(NHighest)).toDF()
    map.+=((x.get(0).toString(), tempDF))
  })
  map
}

val output = findMultipleDF(team_df, 2)
output.map(x=>{
  x._2.show()
})
+-------+--------------+----+----+
|   team|        player|hits|Rank|
+-------+--------------+----+----+
|dodgers|cody bellinger|  20|   1|
|dodgers| justin turner|  15|   2|
+-------+--------------+----+----+
+-------+-----------------+----+----+
|   team|           player|hits|Rank|
+-------+-----------------+----+----+
|yankees|      aaron judge|  24|   1|
|yankees|giancarlo stanton|  20|   2|
+-------+-----------------+----+----+

您可以像上面那样尝试,但不确定为什么要在不同的数据框中输出。


推荐阅读