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

首先理解他们的概念

一、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的区别是什么?

转载于:https://my.oschina.net/cjun/blog/680285

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值