数据:

hive order by指定顺序 hive sort_hive

1、order by 会对输入做全局排序,因此只有一个 reducer,会导致当输入规模较大时,需要较长的计算时间。
演示:

select
id,
score,
subject
from score1 order by score;

结果图:

hive order by指定顺序 hive sort_数据_02

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的结果进行排序

hive order by指定顺序 hive sort_mapreduce_03

3、distribute by(字段)根据指定字段将数据分到不同的 reducer,分发算法是 hash 散列。

--开启粪桶
set hive.enforce.bucketing = true;
set mapreduce.job.reduces=3;
select
id,
score,
subject
from score1 distribute by id;

hive order by指定顺序 hive sort_数据_04

4、Cluster by(字段) 除了具有 Distribute by 的功能外,还会对该字段进行排序。

select
id,
score,
subject
from score1 cluster by id;

hive order by指定顺序 hive sort_hive_05