说明Hive中order by,sort by,distribute by,cluster by的作用

笼统地看,这四个在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
已标记关键词 清除标记
©️2020 CSDN 皮肤主题: 1024 设计师:上身试试 返回首页