Hive中rank()、row_number()函數的用法


1. 函數說明

rank() 排序相同時會重復,總數不會變

dense_rank() 排序相同時會重復,總數會減少

row_number() 會根據順序計算

2. 操作案例

2.1 數據准備

孫悟空	語文	87
孫悟空	數學	95
孫悟空	英語	68
唐僧	語文	94
唐僧	數學	56
唐僧	英語	84
豬八戒	語文	64
豬八戒	數學	86
豬八戒	英語	84
沙僧	語文	65
沙僧	數學	85
沙僧	英語	78

  創建hive 表,導入數據。

[fanl@centos7 ~]$ vi score.txt
[fanl@centos7 ~]$ cd /opt/modules/cdh5.14.2/hive-1.1.0-cdh5.14.2/
[fanl@centos7 hive-1.1.0-cdh5.14.2]$ bin/hive
 
hive (default)> create table score(
              > name string,
              > subject string,
              > socre int)
              > row format delimited fields terminated by '\t';
OK
Time taken: 4.504 seconds
hive (default)> load data local inpath '/home/fanl/score.txt' into table score;
Loading data to table default.score
Table default.score stats: [numFiles=1, totalSize=17239]
OK
Time taken: 0.76 seconds
hive (default)>

  

2.2 實際操作

需求:計算每門學科成績排名

分析:按照學科分組,再按照成績排序,使用partition by subject order by score

(1)row_number()僅僅是加了序號

hive (default)> select name,subject,score,row_number() 
> over(partition by subject order by score desc) as rank from score;
OK
name	subject	score	rank
孫悟空	數學	95	1
豬八戒	數學	86	2
沙僧	數學	85	3
唐僧	數學	56	4
豬八戒	英語	84	1
唐僧	英語	84	2
沙僧	英語	78	3
孫悟空	英語	68	4
唐僧	語文	94	1
孫悟空	語文	87	2
沙僧	語文	65	3
豬八戒	語文	64	4

  (2)rank() 可以顯示相同的數據,下一名的排序+1,即為跳躍排序

hive (default)> select name,subject,score,rank() 
> over(partition by subject order by score desc) as rank from score;
OK
name	subject	score	rank
孫悟空	數學	95	1
豬八戒	數學	86	2
沙僧	數學	85	3
唐僧	數學	56	4
豬八戒	英語	84	1
唐僧	英語	84	1
沙僧	英語	78	3
孫悟空	英語	68	4
唐僧	語文	94	1
孫悟空	語文	87	2
沙僧	語文	65	3
豬八戒	語文	64	4

  (3)dense_rank(),即使有相同的數據,也會按照連續排序

hive (default)> select name,subject,score,dense_rank() 
> over(partition by subject order by score desc) as rank from score;
OK
name	subject	score	rank
孫悟空	數學	95	1
豬八戒	數學	86	2
沙僧	數學	85	3
唐僧	數學	56	4
豬八戒	英語	84	1
唐僧	英語	84	1
沙僧	英語	78	2
孫悟空	英語	68	3
唐僧	語文	94	1
孫悟空	語文	87	2
沙僧	語文	65	3
豬八戒	語文	64	4

  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM