hive聚合函数之排序

1 全局排序(Order By)

Order By:全局排序,只有一个Reduce。
(1).使用Order By子句排序
asc(ascend):升序(默认)
desc(descend):降序
(2).Order By子句在select语句的结尾

基础案例实操

(1)查询员工信息按工资升序排列

select 
    * 
from emp 
order by sal;

hive聚合函数之排序_第1张图片
hive聚合函数之排序_第2张图片
(2)查询员工信息按工资降序排列

select 
    * 
from emp 
order by sal desc;

hive聚合函数之排序_第3张图片
(3)按照员工薪水的2倍排序

select 
    ename, 
    sal * 2 twosal 
from emp 
order by twosal;

hive聚合函数之排序_第4张图片
hive聚合函数之排序_第5张图片

(4) 多个列排序案例实操
按照部门和工资升序排序。

select 
    ename, 
    deptno, 
    sal 
from emp 
order by deptno, sal;

hive聚合函数之排序_第6张图片
hive聚合函数之排序_第7张图片

2 每个Reduce内部排序(Sort By)

Sort By:对于大规模的数据集order by的效率非常低。在很多情况下,并不需要全局排序,此时可以使用Sort by。
Sort by为每个reduce产生一个排序文件。每个Reduce内部进行排序,对全局结果集来说不是排序。
(1)设置reduce个数

set mapreduce.job.reduces=3;

(2)查看设置reduce个数

set mapreduce.job.reduces;

(3)根据部门编号降序查看员工信息

select 
    * 
from emp 
sort by deptno desc;

hive聚合函数之排序_第8张图片

hive聚合函数之排序_第9张图片
通过两次sort by 排序比一次order by排序执行效率高
hive聚合函数之排序_第10张图片

3 分区(Distribute By)

Distribute By:在有些情况下,我们需要控制某个特定行应该到哪个Reducer,通常是为了进行后续的聚集操作。distribute by子句可以做这件事。distribute by类似MapReduce中partition(自定义分区),进行分区,结合sort by使用。
对于distribute by进行测试,一定要分配多reduce进行处理,否则无法看到distribute by的效果。

案例实操:
(1)设置reduce个数

set mapreduce.job.reduces=3;

(2)查看设置reduce个数

set mapreduce.job.reduces;

(3) 先按照部门编号分区,再按照员工编号薪资排序

select 
    * 
from emp 
distribute by deptno 
sort by sal desc;

distribute by的分区规则是根据分区字段的hash码与reduce的个数进行相除后,余数相同的分到一个区。
Hive要求distribute by语句要写在sort by语句之前。
演示完以后mapreduce.job.reduces的值要设置回-1,否则下面分区or分桶表load跑MapReduce的时候会报错。

hive聚合函数之排序_第11张图片
hive聚合函数之排序_第12张图片

4 分区排序(Cluster By)

当distribute by和sort by字段相同时,可以使用cluster by方式。
cluster by除了具有distribute by的功能外还兼具sort by的功能。但是排序只能是升序排序,不能指定排序规则为asc或者desc。

select 
    * 
from emp 
cluster by deptno;

select 
    * 
from emp 
distribute by deptno 
sort by deptno;

hive聚合函数之排序_第13张图片
hive聚合函数之排序_第14张图片

你可能感兴趣的:(hive,hive,hadoop,数据仓库)