笼统地看,这四个在hive中都有排序和聚集的作用,然而,它们在执行时所启动的MR却各不相同。
1、order by
order by会对所给的全部数据进行全局排序,并且只会“叫醒”一个reducer干活。它就像一个糊涂蛋一样,不管来多少数据,都只启动一个reducer来处理。因此,数据量小还可以,但数据量一旦变大order by就会变得异常吃力,甚至“罢工”。
- order by(ASC | DESC):类似mysql
- 只使用一个Reducer执行全局数据排序
- 速度慢,应提前做好数据过滤
- 支持使用CASE WHEN或表达式
- 支持按位置编号排序,需要设置:set hive.groupby.orderby.position.alias=true
select * from offers order by case when offerid = 1 then 1 else 0 end;
select * from offers order by 1;
2、sort by
sort by是局部排序。相比order by的懒惰糊涂,sort by正好相反,它不但非常勤快,而且具备分身功能。sort by会根据数据量的大小启动一到多个reducer来干活,并且,它会在进入reduce之前为每个reducer都产生一个排序文件。这样的好处是提高了全局排序的效率。
- SORT BY对每个Reducer中的数据进行排序
- 当Reducer数量设置为1时,等于ORDER BY
- 排序列必须出现在SELECT column列表中
3、distribute by
distribute by的功能是:distribute by 控制map结果的分发,它会将具有相同字段的map输出分发到一个reduce节点上做处理。即就是,某种情况下,我们需要控制某个特定行到某个reducer中,这种操作一般是为后续可能发生的聚集操作做准备。这样肯定是全局有序的,因为相同的字段会被放到同一个reducer处理,distribute by需要和sort by一起使用,distribute by必须要写在sort by之前。
- distribute by :类似mysql的group by
- 确保具有匹配列值的行被分区到相同的Reducer
- 不会对每个Reducer的输出进行排序
- 通常使用在SORT BY语句之前
select id,name,score from stu_score
distribute by id
sort by score desc;
4、cluster by
如果sort by和distribute by中所用的列相同,可以缩写为cluster by以便同时指定两者所用的列。
- cluster by :除了具有distribute by 的功能外,还会对该字段进行排序。
- CLUSTER BY = DISTRIBUTE BY + SORT BY
- 不支持ASC|DESC
- 排序列必须出现在SELECT column列表中
- 为了充分利用所有的Reducer来执行全局排序,可以先使用CLUSTER BY,然后使用ORDER BY