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|
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值