Spark数据框分组,排序和选择一组列的顶部行 [英] Spark dataframe grouping, sorting, and selecting top rows for a set of columns

查看:91
本文介绍了Spark数据框分组,排序和选择一组列的顶部行的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在使用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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆