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