MapJoin(默认是开启的)(小表join大表时使用,可以有效提高效率) 内存足够大可以把阈值调大(默认25M以下认为是小表) set hive.mapjoin.smalltable.filesize = ?; MapJoin工作机制:join机制在map阶段完成,把小表全部加载到内存在map端进行join,避免reduce处理。
Group By (1) (默认情况,map阶段同一key数据分发给一个reduce,当一个key数据过大时就会发生数据倾斜) (2) 并不是聚合操作都要在reduce完成,也可以开启map端进行预聚合(combiner)(默认是开启的) (3)在发现有数据倾斜的时候可以打开负载均衡(默认是false) hive.groupby.skewindata = true;(确定存在数据倾斜时打开) 开启后会生出两个MRJob,第一个job中,map的输出结果会随机分布到reduce中,每个reduce做部分聚合,并输出结果;第二个Job再根据预处理的结果按照group by key分布到reduce中,最后完成最终聚合。
count(distinct) 去重统计(尽量不用,用groupby来代替) 先group by 再count,避免oom或者数据倾斜 只有一个reducer在进行count(distinct)的计算