Hive之cluster by , distribute by,order by,sort by
Posted 健哥说编程
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Hive之cluster by , distribute by,order by,sort by相关的知识,希望对你有一定的参考价值。
order by,sort by ,distrubute by , cluster by
首先,可以通过以下语句,来修改reduce的个数,默认为-1由hive自行决定。
hive (db01)> set mapred.reduce.tasks=2;
先将reduce个数设置为2:
hive (db01)> set mapred.reduce.tasks;
mapred.reduce.tasks=2
将数据导出,可见,直接将数据导出时,默认的reduce个数为0:
数据:
hive (db01)> select * from stud;
OK
ID NAME
1Jack
2Mary
3Alex
4Mark
5Rose
1、order by
Hive中的order by跟传统的sql语言中的order by作用是一样的,会对查询的结果做一次全局排序,所以说,只有hive的sql中制定了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。
2、sort 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,如下所示:
查看输出的文件,也确实有两个:
[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
查看里面的内容:
3、distribute by和sort 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;
执行:
查看hdfs上的数据:
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;
查看数据:
通过上面的数据可以看出,每一个reduce的输出已经根据id排序。
4、cluster 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