- order by:会对输入做全局排序,因此只有一个reducer(多个reducer无法保证全局有序)。只有一个reducer,会导致当输入规模较大时,需要较长的计算时间。
- sort by:不是全局排序,其在数据进入reducer前完成排序。
- distribute by:按照指定的字段对数据进行划分输出到不同的reduce中。
- cluster by:除了具有 distribute by 的功能外还兼具 sort by 的功能。
代码:
CREATE TABLE `person`(
`id` int,
`name` string,
`address` string);
insert into person values(1, 'lisi', 'beijing');
insert into person values(2, 'zhangsan', 'chengdu');
insert into person values(3, 'wangwu', 'shanghai');
insert into person values(4, 'zhaoliu', 'guangzhou');
insert into person values(5, 'name5', 'beijing');
-- order by会对查询结果执行一个全局排序,reducer的数量是1。因此这个过程可能会很漫长。
explain insert overwrite local directory '/root/order-by-result' select *
from person order by id asc ;
-- sort by只会对reducer中进行排序,局部排序
set mapreduce.job.reduces=3;
explain insert overwrite local directory '/root/sort-by-result' select * from person sort by id desc;
-- distribute by 控制mapper中的输出在 reducer 中是如何进行划分的,使用distribute by可以保证相同key的记录被划分到一个reducer中
insert overwrite local directory '/root/distribute-by-result' select * from person distribute by id sort by address;
-- cluster by结果和上面一样,修改了sort by后面的好像也不影响查询结果,默认是升序,不可改变顺序
insert overwrite local directory '/root/cluster-by-result' select * from person cluster by id ;