Spark 1.4.x版本以后,为Spark SQL和DataFrame引入了开窗函数,比如最经典,最常用的,row_number(),可以让我们实现分组取topn的逻辑。
row_number()开窗函数的语法说明
首先可以,在SELECT
查询时,使用row_number()
函数 其次,row_number()函数后面先跟上OVER
关键字 然后括号中
,是PARTITION BY
,也就是说根据哪个字段进行分组 其次是可以用ORDER BY
进行组内排序 然后row_number()就可以给每个组内的行,一个组内行号
/**
* 获取各区域top3热门商品
* @param sqlContext
* @return
*/
private static JavaRDD getAreaTop3ProductRDD() {
// 使用开窗函数先进行一个子查询
// 按照area进行分组,给每个分组内的数据,按照点击次数降序排序,打上一个组内的行号
// 接着在外层查询中,过滤出各个组内的行号排名前3的数据
// 其实就是咱们的各个区域下top3热门商品
String sql = "SELECT area, product_id, click_count, city_infos, product_name, product_status "
+ "FROM ("
+ "SELECT area, product_id, click_count, city_infos, product_name, product_status, "
+ "ROW_NUMBER() OVER(PARTITION BY area ORDER BY click_count DESC) rank "
+ "FROM area_fullprod_click_count "
+ ") t "
+ "WHERE rank
关注
打赏