2.12 Hivet中order by,sort by、distribute by和cluster by

https://cwiki.apache.org/confluence/display/Hive/LanguageManual+SortBy

一、order by

对全局数据的排序,仅仅只有一个reduce;

Hive中的order by跟传统的sql语言中的order by作用是一样的,会对查询的结果做一次全局排序,
所以说,只有hive的sql中制定了order by所有的数据都会到同一个reducer进行处理(不管有多少map,
也不管文件有多少的block只会启动一个reducer)。但是对于大量数据这将会消耗很长的时间去执行。

这里跟传统的sql还有一点区别:如果指定了hive.mapred.mode=strict(默认值是nonstrict),这时就必须
指定limit来限制输出条数,原因是:所有的数据都会在同一个reducer端进行,数据量大的情况下可能
不能出结果,那么在这样的严格模式下,必须指定输出的条数。
hive (db_hive)> select * from emp order by empno desc;


二、sort by

Hive中指定了sort by,那么在每个reducer端都会做排序,也就是说保证了局部有序(每个reducer出来的数据是有序的,
但是不能保证所有的数据是有序的,除非只有一个reducer),好处是:执行了局部排序之后可以为接下去的全局排序提高不少的效率
(其实就是做一次归并排序就可以做到全局排序了)。
#我们可以设置一下reduce的个数
hive (db_hive)> set mapreduce.job.reduces= 3;
hive (db_hive)> set mapreduce.job.reduces;   
mapreduce.job.reduces=3

#再执行的时候就会有3个reduce结果,在命令行上输出结果时默认合并了,
hive (db_hive)> select * from emp sort by empno asc;



#如果用下面语句将结果插入到本地目录,就会看到三个结果集
insert overwrite local directory'/opt/datas/sortby-res'select * from emp sort by empno asc;

[root@hadoop-senior ~]# ls /opt/datas/sortby-res/
000000_0  000001_0  000002_0

[root@hadoop-senior ~]# cat /opt/datas/sortby-res/000000_0 
7654MARTINSALESMAN76981981-9-281250.01400.030
7698BLAKEMANAGER78391981-5-12850.0N30
7782CLARKMANAGER78391981-6-92450.0N10
7788SCOTTANALYST75661987-4-193000.0N20
7839KINGPRESIDENTN1981-11-175000.0N10
7844TURNERSALESMAN76981981-9-81500.00.030

[root@hadoop-senior ~]# cat /opt/datas/sortby-res/000001_0 
7499ALLENSALESMAN76981981-2-201600.0300.030
7521WARDSALESMAN76981981-2-221250.0500.030
7566JONESMANAGER78391981-4-22975.0N20
7876ADAMSCLERK77881987-5-231100.0N20
7900JAMESCLERK76981981-12-3950.0N30
7934MILLERCLERK77821982-1-231300.0N10

[root@hadoop-senior ~]# cat /opt/datas/sortby-res/000002_0 
7369SMITHCLERK79021980-12-17800.0N20
7902FORDANALYST75661981-12-33000.0N20


三、distribute by

类似于MapReduce中分区partition,对数据进行分区,结合sort by进行使用;

distribute by必须要写在sort by之前,因为distribute by的功能是要先分区,sort by是对分区进行排序的;

#我这里是对deptno进行分区,然后对empno排序
hive (db_hive)> insert overwrite local directory '/opt/datas/distby-res' select * from emp distribute by deptno sort by empno asc;


#emp表的最后一个字段是deptno,从下面可以看出是按最后一个字段分区的
[root@hadoop-senior ~]# cat /opt/datas/distby-res/000000_0 
7499ALLENSALESMAN76981981-2-201600.0300.030
7521WARDSALESMAN76981981-2-221250.0500.030
7654MARTINSALESMAN76981981-9-281250.01400.030
7698BLAKEMANAGER78391981-5-12850.0N30
7844TURNERSALESMAN76981981-9-81500.00.030
7900JAMESCLERK76981981-12-3950.0N30

[root@hadoop-senior ~]# cat /opt/datas/distby-res/000001_0 
7782CLARKMANAGER78391981-6-92450.0N10
7839KINGPRESIDENTN1981-11-175000.0N10
7934MILLERCLERK77821982-1-231300.0N10

[root@hadoop-senior ~]# cat /opt/datas/distby-res/000002_0 
7369SMITHCLERK79021980-12-17800.0N20
7566JONESMANAGER78391981-4-22975.0N20
7788SCOTTANALYST75661987-4-193000.0N20
7876ADAMSCLERK77881987-5-231100.0N20
7902FORDANALYST75661981-12-33000.0N20


四、cluster by

当distribute by和sort by字段相同时,可以使用cluster by;

cluster by 除了具有 distribute by 的功能外还兼具 sort by 的功能。 所以最终的结果是每个Reduce处理的数据范围不重叠,

而且每个Reduce内的数据是排序的,而且可以打到全局有序的结果。

##
hive (db_hive)> insert overwrite local directory '/opt/datas/cluster-res' select * from emp  cluster by empno;   



##
[root@hadoop-senior ~]# ls /opt/datas/cluster-res/
000000_0  000001_0  000002_0

[root@hadoop-senior ~]# cat /opt/datas/cluster-res/000000_0 
7521WARDSALESMAN76981981-2-221250.0500.030
7566JONESMANAGER78391981-4-22975.0N20
7698BLAKEMANAGER78391981-5-12850.0N30
7782CLARKMANAGER78391981-6-92450.0N10
7788SCOTTANALYST75661987-4-193000.0N20
7839KINGPRESIDENTN1981-11-175000.0N10
7902FORDANALYST75661981-12-33000.0N20

[root@hadoop-senior ~]# cat /opt/datas/cluster-res/000001_0 
7369SMITHCLERK79021980-12-17800.0N20
7654MARTINSALESMAN76981981-9-281250.01400.030
7876ADAMSCLERK77881987-5-231100.0N20
7900JAMESCLERK76981981-12-3950.0N30

[root@hadoop-senior ~]# cat /opt/datas/cluster-res/000002_0 
7499ALLENSALESMAN76981981-2-201600.0300.030
7844TURNERSALESMAN76981981-9-81500.00.030
7934MILLERCLERK77821982-1-231300.0N10


五、总结

OrderBy
全局排序,一个Reduce

Sort By
每个reduce内部进行排序,全局不是排序

Distribute By
类似MR中partition,进行分区,结合sort by使用

Cluster By
当distribute和sort字段相同时,使用方式
原文地址:https://www.cnblogs.com/weiyiming007/p/10761404.html