hive调优之 order/sort/distribute/cluster by

原创
2016/05/24 09:47
阅读数 717

首先理解他们的概念

一、order by

参考:hive中的Order By
order by a是在一个reduce中按a排序,order by a limit 10也是在一个reduce中排序,取10个。 这种方式如果碰到数据量大的话,就会很耗时或者内存溢出,因为整个任务只有一个job,job中只有一个reduce。
之前我的对order by a limit 10的理解是,会在map端排序,取10个,然后在reduce端汇总排序,其实这是错误的,因为在map端没法取前10的,map只是对每一行记录做处理,只有在reduce端才能知道前10和取出前10。 所以sort by有2个job

二、sort by

参考:hive中的sort by

sort by a,如果设置了多个reduce,则是在多个reduce中各自按a排序,总体是没有顺序的,在参考的文章中很清楚。如果只有一个reduce,则是全体排好序的,就跟order by功能相同。sort by a limit 10会启动2个job来排序,第一个job有可能会多个reduce,输出多个reduce文件,每个reduce文件取前10,再经过第二个job,取出上一个job的每个reduce的前10个,汇总排序,就总体是顺序的了。

三、distribute by和Cluster By

distribute by a是a 相同的会被划分到相同的reduce中,但是不排序。如果使用distribute by a sort by a,就能保证a相同的都在一个reduce中,并且拍好了序。

而cluster by的功能就是distribute by a sort by a的功能。

参考:Hive学习之SELECT语句(二)

理解了上面的概念之后,我们就很清楚,做全局排序时,如果数据量很大的排序时,尽量不要使用order by limit,而是要使用 sort by limit。如果数据量很小,用sort by limit时间反而更多,因为要启动2个job。

参考:

Hive中SELECT TOP N的方法(order by与sort by),这篇文章详细解释了为什么要用sort by a limit N。

Hive中Order by和Sort by的区别是什么?

展开阅读全文
加载中
点击引领话题📣 发布并加入讨论🔥
0 评论
0 收藏
2
分享
返回顶部
顶部