hive 中row_number(),rank,dense_ran()的用法
Posted elsearch
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了hive 中row_number(),rank,dense_ran()的用法相关的知识,希望对你有一定的参考价值。
hive中一般取top n时,row_number(),rank,dense_ran()这三个函数就派上用场了,
先简单说下这三函数都是排名的,不过呢还有点细微的区别。
通过代码运行结果一看就明白了。
示例数据:
1 a 10 2 a 12 3 b 13 4 b 12 5 a 14 6 a 15 7 a 13 8 b 11 9 a 16 10 b 17 11 a 14
sql语句
select id, name, sal, rank()over(partition by name order by sal desc ) rp, dense_rank() over(partition by name order by sal desc ) drp, row_number()over(partition by name order by sal desc) rmp from f_test
结果
10 b 17 1 1 1 3 b 13 2 2 2 4 b 12 3 3 3 8 b 11 4 4 4 9 a 16 1 1 1 6 a 15 2 2 2 11 a 14 3 3 3 5 a 14 3 3 4 7 a 13 5 4 5 2 a 12 6 5 6 1 a 10 7 6 7
从结果看出
rank() 排序相同时会重复,总数不会变
dense_rank()排序相同时会重复,总数会减少
row_number() 会根据顺序计算
正好听到一个需求,求sal前50%的人
用这个写了一下,
select * from ( select id, name, sal, rank()over(partition by name order by sal desc ) rp, dense_rank() over(partition by name order by sal desc ) drp, row_number()over(partition by name order by sal desc) rmp, count(*)over(partition by name) *0.5 as count from f_test ) t where t.rp <t.count;
感觉虽然可以实现,但是有点复杂,有没有更好的方法实现呢
以上是关于hive 中row_number(),rank,dense_ran()的用法的主要内容,如果未能解决你的问题,请参考以下文章
hive的row_number()rank()和dense_rank()的区别以及具体使用
Hive分析窗体函数之NTILE,ROW_NUMBER,RANK和DENSE_RANK