1、在Hive中使用Order By的话,reduce的个数始终默认为1,无法通过
set mapreduce.job.reduces=num;
来设置reduce的个数,并且排序速度较慢。
Hive的分区排序1、当有大规模数据集,且不强制要求全局排序,以及数据分区排序规则时,可以只使用Sort By关键词。
通过设置reduce的个数为num:
set mapreduce.job.reduces=num;
再通过Sort By,在每个reducer内产生一个排序文件,对部门编号降序,相对全局排序来看,Sort By是随机的。
select * from emp sort by deptId desc;
2、当为进行后续的聚集操作,需要控制某个特定行应该到哪个reducer时,通过Distribute By和Sort By结合使用,达到效果。
例如,将按照部门分区,薪资排序的情况
select * from emp distribute by deptId sort by salary desc;
Distribute By的分区规则是根据分区字段的 hash 码与 reduce 的个数进行模除后, 余数相同的分到一个区。
3、针对Distribute By和Sort By后的字段一样时,可以使用Cluster By。
例如,按照部门分区,同时按照部门排序的情况
select * from emp distribute by deptId sort by deptId; select * from emp cluster by deptId;
注意:在使用Cluster By的语句中,不能使用desc降序排序。



