码迷,mamicode.com
首页 > 编程语言 > 详细

Hive学习之排序

时间:2020-04-24 14:38:20      阅读:75      评论:0      收藏:0      [点我收藏+]

标签:情况   需要   排序规则   font   注意   esc   规则   控制   mapr   

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学习之排序

标签:情况   需要   排序规则   font   注意   esc   规则   控制   mapr   

原文地址:https://www.cnblogs.com/mayucheng123/p/12767185.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!