Hive 函数之 Rank 函数案例

文章目录

首先rank() 是一个排名函数,

函数说明

rank() 排名的时候,排序相同会重复,但总数不变
dense_rank() 排序相同时会重复,但是总数会减少
row_number() 会根据顺序计算,值一样,也不会出现重复排序

数据准备

namesubjectscore
孙悟空语文87
孙悟空数学95
孙悟空英语68
大海语文94
大海数学56
大海英语84
宋宋语文64
宋宋数学86
宋宋英语84
婷婷语文65
婷婷数学85
婷婷英语78

需求

计算每门学科成绩排名。

创建本地 score.txt,导入数据

vim score.txt
孙悟空	语文	87
孙悟空	数学	95
孙悟空	英语	68
大海	语文	94
大海	数学	56
大海	英语	84
宋宋	语文	64
宋宋	数学	86
宋宋	英语	84
婷婷	语文	65
婷婷	数学	85
婷婷	英语	78

创建 hive 表并导入数据

create table score(
name string,
subject string, 
score int) 
row format delimited fields terminated by "\t";

load data local inpath '/opt/hive/data/score.txt' into table score;

按需求查询数据

select
t1.name,
t1.subject,
t1.score,
rank() over(partition by t1.subject order by t1.score desc) rank1,
dense_rank() over(partition by t1.subject order by t1.score desc) rank2,
row_number() over(partition by t1.subject order by t1.score desc) rank3
from
score t1;

rank() 方式查询

select *,rank() over(partition by subject order by score desc) as rank from score;

结果如下

《Hive 函数之 Rank 函数案例》

我们发现,英语部分,有两个相同的分数,大海和松松,英语84,并列第一,且宋宋在大海的后面,发现rank 排名, 宋宋后面的婷婷,直接是第三,由此得知,rank() 是跳跃式排名,总数保持不变

dense_rank() 方式查询

select *,dense_rank() over(partition by subject order by score desc) as rank from score;

结果如下

《Hive 函数之 Rank 函数案例》
由此图可发现,英语科目,大海和宋宋还是并列第一,但是婷婷却变成了第二,孙悟空第三,
由此可见,dense_rank() 函数 ,非跳跃式排名,影响了总数,因为一共四个人,却成了三个

row_number() 查询

select *,row_number() over(partition by subject order by score desc) as rank from score;

结果如下

《Hive 函数之 Rank 函数案例》
我们看到 大海和宋宋,英语虽然都是 84分,但是两人却排了名次, 第一和第二,由此可见,row_number() 会根据顺序计算,值一样,也不会出现重复排序,

    原文作者:Alienware^
    原文地址: https://blog.csdn.net/weixin_45417821/article/details/119321671
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞