2016-06-21 52 views
3

我正在使用Spark 1.5.0。我有以下的列火花数据帧:火花数据帧分组,排序和选择一组列的顶部行

| user_id | description | fName | weight | 

我想要做的是选择前10名和后10行(根据列加权的值,这是数据类型双)每用户。我如何使用SparkSQL或数据框操作来做到这一点?

例如。为了简单起见,我只选择每个用户的前2行(基于重量)。我想对绝对重量的值进行分类。

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 

回答

1

您可以使用窗口函数与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) 

火花1.5.0可以使用的,而不是rowNumberrow_number

+0

我认为row_number不包含在Spark 1.5中。我得到这个错误:scala> import org.apache.spark.sql.functions.row_number :29:error:value row_number is not a member of org.apache.spark.sql.functions import org.apache.spark .sql.functions.row_number – user3803714

+0

你说得对,但即使函数名称不同('rowNumber'),解决方案也是一样的。 – zero323

+0

单独计算的行号与数据集df记录相关联的方式如何? –