首页 > 代码库 > hive优化

hive优化

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 = http://www.mamicode.com/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