假设有一个表a,结构如下:
par id
c 3
c 7
b 8
b 6
a 1
a 4
a 5
c 9
a 10
b 2
- order by
全排序,只会启动一个reduce
执行任务。select * from a order by id; -- 在hdfs上只会生成一个文件,里面为排序好的1-10,耗时较长。
- sort by
局部排序,会根据数据量启动一个或多个reduce
执行任务,每个reduce
只会排序自己接受的数据。set mapreduce.job.reduces = 3; select * from a sort by id; -- 因为设置了reduces 为3,所以会生成3个文件,10行数据随机排好序分布在3个文件中。
- distribute by
控制分发,distribute by
会控制同一key
的值分发到同一reduce
,要和sort by
一起使用。select * from a distribute by par sort by id;
- cluster by
sort by+distribute by=cluster by
,当distribute by
的字段与sort by
的字段一样时,最好使用cluster by
。但是cluster by
只能升序排序,无法降序排序。select * from a cluster by par ;