谈谈hive的order by ,sort by ,distribute by 和 cluster by

总说:

笼统地看,这四个在hive中都有排序和聚集的作用,然而,它们在执行时所启动的MR却各不相同。

细讲:

order by:

order by会对所给的全部数据进行全局排序,并且只会“叫醒”一个reducer干活。它就像一个糊涂蛋一样,不管来多少数据,都只启动一个reducer来处理。因此,数据量小还可以,但数据量一旦变大order  by就会变得异常吃力,甚至“罢工”。

sort by:

sort by是局部排序。相比order  by的懒惰糊涂,sort by正好相反,它不但非常勤快,而且具备分身功能。sort by会根据数据量的大小启动一到多个reducer来干活,并且,它会在进入reduce之前为每个reducer都产生一个排序文件。这样的好处是提高了全局排序的效率。

distribute by:

distribute by的功能是:distribute  by 控制map结果的分发,它会将具有相同字段的map输出分发到一个reduce节点上做处理。即就是,某种情况下,我们需要控制某个特定行到某个reducer中,这种操作一般是为后续可能发生的聚集操作做准备。

举一个最常见的栗子:

 接上面,

 

 

以上栗子为在根据年份和气温对气象数据进行排序时,我们希望看到同一年的数据被放到同一个reducer中去处理。因而,这个结果也肯定是全局排序的。特别的,因为distribute  by  通常和sort  by 一起用,所以当distribute by 遇上 sort by时,distribute by要放在前面,这个不难理解,因为要先通过distribute by 将待处理的数据从map端做分发,这样,sort by 这个擅长局部排序的才能去放开的干活。不然要是没有distribute  by的分发,那么sort  by 将要处理全部的数据,即全局排序,这不是sort  by的活,这样做只能拖慢集群工作效率。

cluster by:

cluster by,在《Hadoop权威指南第二版》中这样描述道:

 也就是说,如果参照上面气象数据的栗子,当二者皆取year列时,sql语句如下:

from recrds2
select year , temperature
cluster by year;

 

 

评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值