hive--row_number() 组内排序函数

1.要解决的问题

相对用一次请求得到的item的粗排进行排序,平时得到的粗排结果是[0,1]之间的一个值,但是想将其转换为index的形式。

2.解决方案

hive中的函数row_number() 

使用方法:

select COLUMN_A,COLUMN_B,
row_number() OVER (partition BY COLUMN_A ORDER BY COLUMN_B ASC/DESC) rn
from table

rn 是排序的别名执行时每组的编码从1开始 
partition by:类似hive的建表,分区的意思;COLUMN_A 是分组字段 
order by :排序,默认是升序,加desc降序;COLUMN_B 是排序字段

在分组内,进行排序。

3.结果

分析:

针对我的这个问题,COLUMN_A字段就表示一次请求,对一次请求召回的item粗排的结果,排序依据是按照COLUMN_B,就是粗排的得分,产生的结果是rn。

左边一列是得分,右边一列是排序结果:

问题:如果order by中的col2中元素相同,怎么序号怎么标注?

答:仍然按照顺序排列,但是每次运行的结果都不一样,比如:

col1col2col3rn col1col2col3rn
q122a1 q122b1
q122b2 q122a2
q123c3 q123c3
q211q1 q211q1
q211w2 q211w2
q212e3 q212e3

4.其他排序的函数

RANK() DENSE_RANK()

先来看个例子:

select province,city,
rank() over (order by people desc) rank,
dense_rank() over (order by people desc) dense_rank,
row_number() over(order by people desc) row_number
from datatable
group by province,city,people;

运行结果:

province   city  rank  dense_rank   row_number
浙江    杭州    1       1       1
江苏    苏州    2       2       2
江苏    南京    3       3       3
浙江    温州    4       4       4
江苏    某市    4       4       5
浙江    宁波    6       5       6
江苏    某某市  7       6       7
浙江    嘉兴    7       6       8

主要注意打圈的:
row_number:顺序下来
rank:在遇到数据相同项时,会留下空位5,(第一列4,4,6)
dense_rank:在遇到数据相同项时,不会留下空位,(红框内第一列,4,4,5)

参考:https://blog.csdn.net/jobschen/article/details/70821064

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值