spark分组求top值JAVA版本

在工作中我们常常会遇到在一堆数据中求top值的问题,也会遇到分组求top值的现象,分组如何求解呢?这时候我们可以借助窗口函数进行实现,在spark中使用row_number进行实现。本文的实现使用的是java版本实现,并不是使用spark sql实现的,因为使用spark sql实现需要使用临时视图,比较麻烦,下次补充spark sql版本。

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

1.首先对要进行分组的数据分组进行排序,并计算各数据在自己所在组内的排名的名次。

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

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

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

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

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

其中rowNumber为排名列,后面的filter表示得到的各分组的top50的数据。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值