Spark数据框分组,排序和选择一组列的顶部行 [英] Spark dataframe grouping, sorting, and selecting top rows for a set of columns
问题描述
我正在使用Spark 1.5.0.我有一个带有以下列的Spark数据框:
I am using Spark 1.5.0. I have a Spark dataframe with following columns:
| user_id | description | fName | weight |
我想做的是为每个用户选择前10行和后10行(基于列权重的值,该列的数据类型为Double).如何使用Spark SQL或数据框操作做到这一点?
What I would like to do is to select top 10 and bottom 10 rows (based on the value of column weight, which is of datatype Double) per user. How do I do that using Spark SQL or dataframe operations?
例如.为简单起见,我仅选择每个用户的前2行(基于重量).我想按绝对重量的值对o/p进行排序.
For example. for simplicity I am only selecting top 2 rows (based on weight) per user. I would like to sort the o/p on the value of the absolute weight.
u1 desc1 f1 -0.20
u1 desc1 f1 +0.20
u2 desc1 f1 0.80
u2 desc1 f1 -0.60
u1 desc1 f1 1.10
u1 desc1 f1 6.40
u2 desc1 f1 0.05
u1 desc1 f1 -3.20
u2 desc1 f1 0.50
u2 desc1 f1 -0.70
u2 desc1 f1 -0.80
这是所需的o/p:
u1 desc1 f1 6.40
u1 desc1 f1 -3.20
u1 desc1 f1 1.10
u1 desc1 f1 -0.20
u2 desc1 f1 0.80
u2 desc1 f1 -0.80
u2 desc1 f1 -0.70
u2 desc1 f1 0.50
推荐答案
您可以将窗口函数与row_number
一起使用:
You can use window functions with row_number
:
import org.apache.spark.sql.functions.row_number
import org.apache.spark.sql.expressions.Window
val w = Window.partitionBy($"user_id")
val rankAsc = row_number().over(w.orderBy($"weight")).alias("rank_asc")
val rankDesc = row_number().over(w.orderBy($"weight".desc)).alias("rank_desc")
df.select($"*", rankAsc, rankDesc).filter($"rank_asc" <= 2 || $"rank_desc" <= 2)
在Spark 1.5.0中,您可以使用rowNumber
代替row_number
.
In Spark 1.5.0 you can use rowNumber
instead of row_number
.
这篇关于Spark数据框分组,排序和选择一组列的顶部行的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!