Hive hql语句 排序【全局排序、按别名排序、多个列排序、局部排序、分区排序】


1.全局排序

Order By :

  • 1.使用order by 子句排序:
    • ASC(ascend):升序(默认)
    • DESC(descend):降序
  • 2.order by 子句在select语句的结尾。

案例实操:

(1)查询学生成绩,并按照分数降序排列。

select * from student s 
left join score sco 
on s.s_id = sco.s_id 
order by sco.s_score DESC;

命令采用左外连接,按分数列降序查询

执行结果如下:
在这里插入图片描述

(2)查询学生成绩,并且按照分数升序排列

select * from student s 
left join score sco 
on s.s_id = sco.s_id 
order by sco.s_score ASC;

命令按照左外连接,按分数列升序查询。

执行结果如下:
在这里插入图片描述
mV0L3NodXl2,size_16,color_FFFFFF,t_70)

2.按照别名排序

案例实操

select s_id ,avg(s_score) avg 
from score 
group by s_id 
order by avg;

执行结果如下:
在这里插入图片描述


3.多个列排序

案例实操

select s_id ,avg(s_score) avg 
from score 
group by s_id 
order by s_id,avg;

上述hql命令,先对s_id进行分组,求平均值,然后进行排序,先是按照s_id进行排序,然后按照平均值avg(别名)进行排序。

扫描二维码关注公众号,回复: 13304689 查看本文章

结果如下:
在这里插入图片描述


4.每个MapReduce内部排序(Sort By)局部排序

sort by:每个MapReduce内部进行排序,对全局结果集来说不是排序。

案例操作:

(1)设置reduce个数

set mapreduce.job.reduces=3;

(2)查看reduce个数

set mapreduce.job.reduces;

(3)将查询结果按照成绩降序排列

select * from score sort by s_score;

执行结果如下:
在这里插入图片描述
局部排序,三个reduce的结果

(4)将查询结果导入文件当中

按照成绩降序排列

insert overwrite 
local directory '/usr/Data_train/out_result' 
select * from score 
sort by s_score;

执行结果如下:在本地去查看hql语句的查询结果
在这里插入图片描述


5.分区排序

Distribute By:类似于MR中的partation,进行分区,结合sort by使用。

注意事项:

  • 1.Hive要求Distribute By 语句写在 sort by 语句之前。
  • 2.对于distracte by进行测试,一定要多分配reduce进行处理,否则无法看到distribute by的效果。

案例实操

首先按照学生id进行分区,然后再按照学生成绩进行排序

(1)设置reduce的个数,将我们对应的s_id划分到对应的reduce当中去。

set mapreduce.job.reduces=7;

(2)通过distribute by进行数据的分区。

insert overwrite 
local directory '/export/servers/hivedatas/sort' 
select * from score 
distribute by s_id 
sort by s_score;

在这里插入图片描述


6.CLUSTER BY

当distribute by和sort by字段相同时,可以使用cluster by方式。

cluster by除了具有distribute by的功能外还兼具sort by的功能。但是排序只能是倒序排序,不 能指定排序规则为ASC或者DESC。

例如下面俩种写法等价:

select * from score cluster by s_id; 
select * from score distribute by s_id sort by s_id;

猜你喜欢

转载自blog.csdn.net/shuyv/article/details/111405882