在工作中我们常常会遇到在一堆数据中求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的数据。