1.官方文档:https://cwiki.apache.org/confluence/display/Hive/LanguageManual+SortBy
启动时的一些提示信息
In order to change the average load for a reducer (in bytes):
set hive.exec.reducers.bytes.per.reducer=<number>
In order to limit the maximum number of reducers:
set hive.exec.reducers.max=<number>
为了限制reducers的最大值:set hive.exec.reducers.max=<number>
In order to set a constant number of reducers:
set mapreduce.job.reduces=<number>
设置MapReduce的job任务的reducer数目
2.order by
对全局数据的一个排序,仅仅只有一个reduce,使用的时候要注意一下
desc表示降序 默认是asc升序的。
select * from emp order by empno desc ;
3.sort by
对每一个reduce内部数据进行排序,没有排序全局结果集。
首先设置3个reducer
set mapreduce.job.reduces=3;
shell中查询
select * from emp sort by empno ;
然后呢,你会发现这个查询结果和order by差不多,嗯,这个时候我们把他保存到本地文件中再查看一下啦
insert overwrite local directory '/opt/datas/sort-result'
select * from emp sort by empno asc ;
会发现对应路径下生成了三个文件 ,而且文件里面的数据都排好序。
4.distribute by
类似于MapReduce中的partition,对数据进行分区,结合sort by进行使用
insert overwrite local directory '/opt/datas/distribute-result'
select * from emp
distribute by deptno
sort by empno asc ;
注意distribute by一定要在sort by前面
不使用distribute by之前,只使用sort by 查询结果
加上distribute by deptno之后(最后一个字段是deptno,然后刚刚好是3个值)
sort by设置了3个reducer对应了三个文件,然后distribute by对应的是三个分区 3个值 一个值一个分区一个文件
可以发现 加上distribute by之后,这里的deptno只有一个值啦
5.cluster by
当distribute by和sort by字段相同时,就可以使用cluster by代替