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的主要内容,如果未能解决你的问题,请参考以下文章