1、列裁剪
select a,b from t where e < 10;
设置参数:
hive.optimize.cp = true
2、分区裁剪
select * from (
select c1,count(1) from t group by c1
) subq
where subq.prtn = 100;
select * from T1 join(
select * from t2
) subq on (t1.c1=subq.c2)
where subq.prtn = 100;
设置参数:
hive.optimize,pruner = true
3、join操作
原则:将条目少的表、子查询放在join操作的左边,原因reduce端join时,join左边的表会被加载到内存中,有效减少内存溢出。
insert overwrite table pv_users
select pv.pageid,u.age from page_view pv
join user u on (pv.userid = u.userid)
join newuser x on (pv.userid = x.userid);
如果join的key一样,可以优化为一个mapreduce处理
4、map join 操作
map join无需reduce就可以在map阶段全部完成,前提是在map过程中可以访问到全部需要的数据
insert overwrite table pv_users
select /*+ MAPJOIN(pv) */ pv.pageid,u.age
from page_view pv join user u on (pv.userid = u.userid);
设置参数:
hive.join.emit.interl = 1000
hive.mapjoin.size.key = 10000
hive.mapjoin.cache.numrows = 10000
hive.join.emit.interl = 1000
5、group by
1/map端部分聚合
hive.map.aggr = true
hive.groupby.mapaggr.checkinterval = 10000设定mapper进行聚合的记录数
2、数据倾斜时进行负载均衡
hive.groupby.skewindata = true
生成两个mapreduce,
第一个MR,map输出的数据随机分布到reduce进行部分聚合,达到负载均衡
第二个MR,按照group by key分布到reduce中
6、合并小文件
hive.merge.mapfiles = true
hive.merge.mapredfiles = true
hive.merge.size.per.task = 256*1000*1000
原文:http://www.cnblogs.com/jsunday/p/3872775.html