2016-06-21 92 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記錄相關聯的方式如何? –