Hive之cluster by , distribute by,order by,sort by

Posted 健哥说编程

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Hive之cluster by , distribute by,order by,sort by相关的知识,希望对你有一定的参考价值。

order bysort by distrubute by , cluster by

首先,可以通过以下语句,来修改reduce的个数,默认为-1hive自行决定。

hive (db01)> set mapred.reduce.tasks=2;

先将reduce个数设置为2

hive (db01)> set mapred.reduce.tasks;

mapred.reduce.tasks=2

将数据导出,可见,直接将数据导出时,默认的reduce个数为0

 

Hive之cluster by , distribute by,order by,sort by


数据:

hive (db01)> select * from stud;

OK

ID   NAME

1Jack

2Mary

3Alex

4Mark

5Rose

 

1order by

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

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

设置为reduce个数为:2

hive (db01)> set mapred.reduce.tasks=2;

SQL语句,并指定order by关键字:

insert overwrite directory '/out001'

row format delimited

fields terminated by '\t'

select id,name from stud order by id;

以下执行显示,虽然设置了mapred.reduce.tasks=2,但还是只有一个reduce

Hive之cluster by , distribute by,order by,sort by

 

 

2sort by

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

设置为reduce个数为:2

hive (db01)> set mapred.reduce.tasks=2;

现在将上面的order by 修改成sort by

insert overwrite directory '/out001'

row format delimited

fields terminated by '\t'

select id,name from stud sort by id;

修改以后,再执行,现在有两个reduer,如下所示:

Hive之cluster by , distribute by,order by,sort by


查看输出的文件,也确实有两个:

[wangjian@hadoop81 ~]$ hdfs dfs -ls /out001;

Found 2 items

-rwxr-xr-x   1 wangjian supergroup         28 2018-07-10 11:33 /out001/000000_0

-rwxr-xr-x   1 wangjian supergroup          7 2018-07-10 11:33 /out001/000001_0

查看里面的内容:

Hive之cluster by , distribute by,order by,sort by

 

3distribute bysort by一起使用

hive中的distribute by是控制在map端如何拆分数据给reduce端的。

hive会根据distribute by后面列,根据reduce的个数进行数据分发,默认是采用hash算法。

对于distribute by进行测试,一定要分配多reduce进行处理,否则无法看到distribute by的效果。

先来看一个只有distribute的示例:

设置为reduce个数为:2

hive (db01)> set mapred.reduce.tasks=2;

SQL语句,注意最后使用distribute by

insert overwrite directory '/out001'

row format delimited

fields terminated by '\t'

select id,name from stud distribute by id;

执行:

Hive之cluster by , distribute by,order by,sort by

 

查看hdfs上的数据:

 

Hive之cluster by , distribute by,order by,sort by

 

Distribute by sort by共同使用

Distribute by 决定根据哪一个列将数据放到不同的reduce中,而sort by 用于指定每一个reduce的排序规则。

设置为reduce个数为:2

hive (db01)> set mapred.reduce.tasks=2;

SQL语句:

insert overwrite directory '/out001'

row format delimited

fields terminated by '\t'

select id,name from stud distribute by id

sort by id asc;

Hive之cluster by , distribute by,order by,sort by


查看数据:

 

Hive之cluster by , distribute by,order by,sort by


 通过上面的数据可以看出,每一个reduce的输出已经根据id排序。

 

4cluster by

Cluster by 的功能,就是distribute by sort by的结合 。注意cluster by 指定的列只能是降序。

设置为reduce个数为:2

hive (db01)> set mapred.reduce.tasks=2;

SQL语句,注意cluster by后面只能是0或是1,然后根据hash值放到不同的文件中:

insert overwrite directory '/out001'

row format delimited

fields terminated by '\t'

select id,name from stud

cluster by pmod(id,2);

执行,由于设置为两个reduce所以,可以看到输出的结果为两个:

 


查看结果:

 

 

小结:

Order by : 全排序。

       Sort by : Reduce排序。

       Distribute by : 对distribute by后面值进行hash以后放到不同的reduce中。

Cluster by distribute by sort by的结合。

 


以上是关于Hive之cluster by , distribute by,order by,sort by的主要内容,如果未能解决你的问题,请参考以下文章

hive中order by,sort by, distribute by, cluster by的用法

Hive SORT BY vs ORDER BY vs DISTRIBUTE BY vs CLUSTER BY

hive中order by,sort by, distribute by, cluster by作用以及用法

hive order by sort by distribute by和sort by一起使用 cluster by

Hive中sort by,order by,cluster by,distribute by总结

Hive : SORT BY vs ORDER BY vs DISTRIBUTE BY vs CLUSTER BY