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

hive row_number等窗口分析函数

hive函数row_numberrank和dense_rank的对比

大数据之Hive:Hive 开窗函数

Oracle分析函数之排序 row_number() & rank()