Hive学习之排序

Posted mayucheng123

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Hive学习之排序相关的知识,希望对你有一定的参考价值。

Hive排序

一、全局排序(order by) 

Order by:全局排序,只有一个reducer

1、使用 Order by 子句排序

升序:ASC,可以不写,默认是升序

降序:DESC,降序

2、order by 语句使用在select语句的结尾

3、案例实操

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

select * from emp order by  sal;

-- (2) 查询员工信息按工资降序排序
 
select  * from  emp order by sal desc;

 

二、每个MapReduce内部排序(sort by)

Sort by : 对于大规模的数据集来说Order by 的效率特别低。很多情况下,不需要全局排序,此时可以使用sort 不要。

Sort by是为每个reducer 产生一个排序文件,对每个reducer内部进行排序,对全局结果不是排序。

案例:

-- 1、设置Reduce个数
 set  mapreduce.job.reducers = 3;
 -- 2、查看设置reduce个数。
set   mapreduce.job.reducers;

-- 3、根据部门编号降序查看员工信息。
select * from emp sort by deptno desc;

-- 4、将查询结果导入文件中
insert overwrite local directory /opt/module/datas/sortby-result
select * from emp sort by deptno desc;

 

三、分区排序(Distribute by)

Distribute by :在某些情况下我们需要控制某个特定行到哪个reducer,通常为了后续的聚合运算,Distribute by 子句可以做这件事儿,Distribute by 类似于MR中的partition,进行分区,结合 Sortby使用。

对于distribute by 进行测试的时候,一定要分配多reduce进行处理。否则无法看到效果。

案例:

-- 先按照部门编号分区,再按照员工编号降序排序。
set  mapreduce.job.reducers = 3;
insert overwrite local directory /opt/moudle/datas/distribute-result
select * from emp distribute by deptno sort by rmpno desc; 

注意:

1、distribute by的分区规则是根据字段的hash码与reduce的个数进行模运算 后,余数相同的分到一个区。

2、hive 要求 distribute by子句放在 sort by 子句的前面。

四、Cluster by

当分区字段(distribute by)和排序字段( sort by)相同时,可以考虑用 Cluster by

cluster by :除了具有 distribute by 的功能外还具备 sort  by 的功能。但是排序只能是升序排序,不能指定排序规则为升序或者降序。

案例:

-- 以下两种写法等到相同的结果

select * from emp cluster by deptno;

select * from emp distribute by deptno sort by deptno;

注意:

按照部门编号分区。不一定就是固定得单个数值,也可以是10号和20号部门分到一个分区里去。

以上是关于Hive学习之排序的主要内容,如果未能解决你的问题,请参考以下文章

hadoop学习之hive

Hive学习之三Hive 函数

Hive学习之二Hive SQL

Hive学习之五 《Hive进阶—UDF操作案例》 详解

Hive学习之三 《Hive的表的详解和应用案例详解》

hive学习之------hive的数据类型