Hive优化学习(join ,group by,in)

本文介绍了Hive的性能优化策略,包括:1) Join优化,提倡将小表放在Join操作符左边,利用MapJoin减少内存溢出;2) Group By优化,通过Map端聚合和数据倾斜处理提高效率;3) 合并小文件以减少HDFS压力和提升处理速度;4) 使用Left Semi Join替代IN操作;5) 排序优化,了解Order by与Sort by的区别;6) 利用分区优化查询;7) 注意Distinct操作的限制;8) 探讨自定义MapReduce脚本的使用与性能影响;9) 介绍UDTF的使用场景和限制;10) 分析Count和Sum函数的使用;最后提到了Hive的本地模式、并发执行、严格模式、动态分区、推测执行等配置优化方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

[color=red][b]一、join优化 [/b][/color]
Join查找操作的基本原则:应该将条目少的表/子查询放在 Join 操作符的左边。原因是在 Join 操作的 Reduce 阶段,位于 Join 操作符左边的表的内容会被加载进内存,将条目少的表放在左边,可以有效减少发生内存溢出错误的几率。
Join查找操作中如果存在多个join,且所有参与join的表中其参与join的key都相同,则会将所有的join合并到一个mapred程序中。
案例:
SELECT a.val, b.val, c.val FROM a JOIN b ON (a.key = b.key1) JOIN c ON (c.key = b.key1)
在一个mapred程序中执行join ;
SELECT a.val, b.val, c.val FROM a JOIN b ON (a.key = b.key1) JOIN c ON (c.key = b.key2)
在两个mapred程序中执行join ,Map join的关键在于join操作中的某个表的数据量很小,案例:
SELECT /*+ MAPJOIN(b) */ a.key, a.value FROM a join b on a.key = b.key 

Mapjoin 的限制是无法执行a FULL/RIGHT OUTER JOIN b,和map join相关的hive参数:
hive.join.emit.interval 
hive.mapjoin.size.key
hive.mapjoin.cache.numrows

由于join操作是在where操作之前执行,所以当你在执行join时,where条件并不能起到减少join数据的作用;
案例:
 SELECT a.val, b.val FROM a LEFT OUTER JOIN b ON (a.key=b.key) 
WHERE a.ds='2009-07-07' AND b.ds='2009-07-07'

最好修改为:
SELECT a.val, b.val FROM a LEFT OUTER JOIN b 
ON (a.key=b.key AND b.ds='2009-07-07' AND a.ds='2009-07-07')

在join操作的每一个mapred程序中,hive都会把出现在join语句中相对靠后的表的数据stream化,相对靠前的变的数据缓存在内存中。当然,也可以手动指定stream化的表:SELECT /*+ STREAMTABLE(a) */ a.val, b.val, c.val FROM a JOIN b ON (a.key = b.key1) JOIN c ON (c.key = b.key1)

[color=red][b]二、group by 优化 [/b][/color]
Map端聚合,首先在map端进行初步聚合,最后在reduce端得出最终结果,相关参数:
hive.map.aggr = true是否在 Map 端进行聚合,默认为 True 
hive.groupby.mapaggr.checkinterval = 100000在 Map 端进行聚合操作的条目数目

数据倾斜聚合优化,设置参数hive.groupby.skewindata = true,当选项设定为 true
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值