hive,spark获取TOPN窗口函数

TOPN
row number
说明: 
row_number() over ([partition col1] [order by col2]) 
rank() over ([partition col1] [order by col2]) 
dense_rank() over ([partition col1] [order by col2]) 
它们都是根据col1字段分组,然后对col2字段进行排序,对排序后的每行生成一个行号,这个行号从1开始递增 
col1、col2都可以是多个字段,用‘,‘分隔
区别: 
1)row_number:不管col2字段的值是否相等,行号一直递增,比如:有两条记录的值相等,但一个是第一,一个是第二 
2)rank:上下两条记录的col2相等时,记录的行号是一样的,但下一个col2值的行号递增N(N是重复的次数),比如:有两条并列第一,下一个是第三,没有第二 
3)dense_rank:上下两条记录的col2相等时,下一个col2值的行号递增1,比如:有两条并列第一,下一个是第二

以spark集成hive为例:

hiveContext.sql("select *,row_number() over(partition by areaName order by clickNum desc) rnb from spark_area_data").registerTempTable("spark_row_number")

hiveContext.sql("select * from spark_row_number where rnb<=3 order by areaLevelName asc,areaName desc").show(100)
  • 1
//测试原数据 spark_area_data(部分数据)
|areaLevelName|areaName|productName|clickNum|extendInfo|
+-------------+--------+-----------+--------+----------+
| A| 东北地区| 奶粉| 153| 第三方|
| B| 华东地区| 果酒| 387| 自营|
| C| 西南地区| 米酒| 277| 自营|
| C| 华南地区| 啤酒| 144| 第三方|
| B| 华东地区| 茶叶| 374| 第三方|
| C| 华南地区| 洋酒| 113| 自营|
| B| 华东地区| 巧克力| 317| 自营|
| B| 华东地区| 白酒| 313| 自营|
| C| 华南地区| 奶粉| 145| 第三方|
| B| 华中地区| 咖啡| 135| 第三方|
| A| 华北地区| 果酒| 241| 自营|
| C| 西南地区| 面包| 186| 第三方|
| C| 西南地区| 巧克力| 261| 自营|
| C| 西南地区| 白酒| 244| 自营|

//结果
|areaLevelName|areaName|productName|clickNum|extendInfo|rnb|
+-------------+--------+-----------+--------+----------+---+
| A| 华北地区| 啤酒| 277| 第三方| 1|
| A| 华北地区| 面包| 275| 第三方| 2|
| A| 华北地区| 巧克力| 260| 自营| 3|
| A| 东北地区| 咖啡| 171| 第三方| 1|
| A| 东北地区| 啤酒| 171| 第三方| 2|
| A| 东北地区| 茶叶| 157| 第三方| 3|
| B| 华中地区| 奶粉| 168| 第三方| 1|
| B| 华中地区| 洋酒| 164| 自营| 2|
| B| 华中地区| 白酒| 160| 自营| 3|
| B| 华东地区| 果酒| 387| 自营| 1|
| B| 华东地区| 洋酒| 383| 自营| 2|

猜你喜欢

转载自blog.csdn.net/lp284558195/article/details/80325837
今日推荐