hive中order by ,sort by ,distribute by 和 cluster by的区别

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中,这种操作一般是为后续可能发生的聚集操作做准备。
举一个最常见的例子:

from records2
select year,temperature
distribute by year

接上面:

sort by year asc,temperature desc

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

cluster by:

如果sort bydistribute by中所有的列相同,可以缩写为cluster by以便同时指定两者所用的列

from recrds2
select year , temperature
cluster by year;

猜你喜欢

转载自blog.csdn.net/qq_42578036/article/details/110139638