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
防晒霜排行榜q122a1q122b1
q122b2 q122a2
q123c3q123c3
q211q1q211q1
q211w2q211w2
q212e3q212e3
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
如图 直线ab cd相交于点o3
浙江 温州 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)动物给人类的启示
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论