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|