数据:
1、order by 会对输入做全局排序,因此只有一个 reducer,会导致当输入规模较大时,需要较长的计算时间。
演示:
select
id,
score,
subject
from score1 order by score;
结果图:
2、sort by 不是全局排序,其在数据进入 reducer 前完成排序。因此,如果用 sort by 进行排序,并且设置 mapred.reduce.tasks>1,则 sort by 只保证每个 reducer 的输出有序,不保证全局有序。
--开启reduce的个数
set mapred.reduce.tasks = 3;
--指定开启分桶
set hive.enforce.bucketing = true;
set mapreduce.job.reduces=5; //经过测试至少要开启5个才能保证得到正确结果,可能不同的数据不同的个数吧,反正我的数据这样测试是准确的
select
id,
score,
subject
from score1
distribute by subject //使相同的key到同一个reduce中去
sort by score; //对同一个reduce的结果进行排序
3、distribute by(字段)根据指定字段将数据分到不同的 reducer,分发算法是 hash 散列。
--开启粪桶
set hive.enforce.bucketing = true;
set mapreduce.job.reduces=3;
select
id,
score,
subject
from score1 distribute by id;
4、Cluster by(字段) 除了具有 Distribute by 的功能外,还会对该字段进行排序。
select
id,
score,
subject
from score1 cluster by id;