spark分组求解前百分之十

上面两篇文章介绍了一下使用spark分组求解top值的两种方式,我们在日常工作中也可能会遇到另外一种情况,即对源数据求解每个分组的前百分之多少的情况,这种情况如何解决呢,其实和分组求top的方式类似,只不过该种情况会使用另外一种窗口函数percent_rank(),下面简单说明一下:

一:java版本

1.准备原始数据

原始数据datasetMarket=spark.read.parquet("basePath").select("学校", "班级","成绩")

2.对要进行分组的数据分组进行排序,并计算各数据在自己所在组内的排名的百分比。

Column alias = functions.percent_rank()
        .over(Window.partitionBy("学校", "班级")
        .orderBy(desc("成绩")));

其中partitionBy()表示分组的粒度,orderby表示按照那个字段排序排名。

最后生成的alias则为要进行分组数据的一个列,其中包含数据的排名信息。

3.将第一步计算得到的排名信息添加为原始数据列中。

datasetMarket.withColumn("rowNumber", alias)
        .filter(col("rowNumber").leq(0.1))

其中rowNumber为排名占比列,后面的filter表示得到的各分组的排名占比小于0.1的结果。

二:sparkSql版本

1.首先准备源数据

datasetMarket=spark.read.parquet("basePath").select("学校", "班级","成绩")

2.创建临时视图

在获取源数据之后,对数据创建临时视图,格式如下:

datasetMarket.createTempView("groupTop")

3.核心语句,分组top值

spark.sql(select "学校, 班级,成绩 from (select 学校, 班级,成绩, percent_rank() 
over(partition by 学校, 班级 order by 成绩 desc) as rowNumber from groupTop) as rn where rn.rowNumber <=0.1")

上面两种方式都可以计算出每个分组的前百分之多少的结果。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值