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

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_40795214/article/details/82190827

总说:

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

细讲:

order by:

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

sort by:

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

distribute by:

distribute by的功能是:某种情况下,我们需要控制某个特定行到某个reducer中,这种操作一般是为后续可能发生的聚集操作做准备。

举一个最常见的栗子:

 接上面,

以上栗子为在根据年份和气温对气象数据进行排序时,我们希望看到同一年的数据被放到同一个reducer中去处理。因而,这个结果也肯定是全局排序的。特别的,当distribute by 遇上 sort by时,distribute by要放在前面,这个不难理解,因为要先通过distribute by 将待处理的数据放到reducer中,才能让sort by去到每个reducer中干活,不然reducer中都没活干,sort by去白跑一趟。

cluster by:

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

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

from recrds2
select year , temperature
cluster by year;

猜你喜欢

转载自blog.csdn.net/qq_40795214/article/details/82190827