scala - 我将如何分组并提取 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 的道奇队的数据帧。
谢谢,祝你有美好的一天!
解决方案
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|
+-------+-----------------+----+----+
您可以像上面那样尝试,但不确定为什么要在不同的数据框中输出。
推荐阅读
- javascript - 如何制作编辑 .JSON 文件中的变量的 HTML 页面?
- javascript - 如何用长字符串中的空字符串替换字符串?
- java - Grails 4 Oauth2 令牌调用另一个服务(grails 应用程序)
- android-permissions - 是否可以取消对内部分布式应用程序的 Android 权限请求要求?
- java - 如何在另一个表中打印用户 ID
- php - 如何在 PHP 中以特定格式获取今天的日期?
- javascript - D3.js WordCloud:单词重叠并且有奇怪的间距和分布
- swift - SwiftUI 参数传递给不带参数的调用
- java - 在 ServletContext 资源 [/WEB-INF/spring-mvc-crud-demo-servlet.xml] 中定义名称为“sessionFactory”的 bean 创建错误:
- pandas - 使用 pandas 进行 Postgres 查询 - 添加显式类型转换