6.5 排序
Hive 共有 4 种排序, order by
和普通的关系型数据库一样.
6.5.1 全局排序 order by
order by
排序
asc
升序
desc
降序
按照别名排序
select ename, sal*2 twosal from emp order by twosal;
多列排序
select ename, deptno, sal from emp order by deptno, sal ;
6.5.2 每个 MapReduce 的结果排序sort by
如果有多个 MapReduce 在工作, 则每个 MapReduce 的结果进行排序.
但是从全局来说, 并没有排序.
1.设置reduce个数set mapreduce.job.reduces=3;
2.查看设置reduce个数
set mapreduce.job.reduces;
3.根据部门编号降序查看员工信息
select * from emp sort by empno desc;
4.将查询结果导入到文件中(按照部门编号降序排序)
insert overwrite local directory '/opt/module/datas/sortby-result'
select * from emp sort by deptno desc;
6.5.3 分区排序 distribute by
distribute by
:类似MR
中partition
,进行分区,结合sort by
使用。
注意,Hive 要求 DISTRIBUTE BY 语句要写在 SORT BY 语句之前。
对于distribute by
进行测试,一定要分配多reduce
进行处理,否则无法看到distribute by
的效果。
set mapreduce.job.reduces=3;
insert overwrite local directory '/opt/module/datas/distribute-result' select * from emp distribute by deptno sort by empno desc;
distribute by deptno
要求从map
出来的结果, 先按照 deptno
分区, 然后进入到不同的 reduce
.
sort by empno desc
每个reduce
的结果按照empno
的降序排序.
6.5.4 cluster by
当 distribute by
和sorts 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;