- where条件优化
优化前(关系数据库不用考虑会自动优化):
select m.cid,u.id from order m join customer u on( m.cid =u.id )where m.dt='20180808';
优化后(where条件在map端执行而不是在reduce端执行):
select m.cid,u.id from (select * from order where dt='20180818') m join customer u on( m.cid =u.id);
-
union all
使用union all+group by来代替union,union会进行去重,需要消耗更多的资源
-
避免使用count(distinct column),用子查询代替
select count(1) from (select id from tablename group by id) tmp;
-
用in代替join
当根据一个表的字段来约束另一个表时,尽量使用in来代替join
select id,name from tb1 a join tb2 b on(a.id = b.id);
select id,name from tb1 where id in(select id from tb2); in 要比join 快
- join的优化
- 把重复关联键少的表放在join前面做关联可以提高join的效率(https://www.cnblogs.com/bgh408/p/11646286.html)
- 大表join大表,过滤掉空值或者将控制转换为随机数,防止大量空值进入到一个reduce中
- map join把小表全部加载到内存在map端进行join,避免reducer处理
- 行列过滤
- 列处理,只需要指定列时,少用select*
- 行处理,如果将副表的过滤条件写在Where后面,那么就会先全表关联,之后再过滤
3.优化
-
设置合理的Map数
map数的影响因素:input的文件总个数,input的文件大小,集群设置的文件块大小
-
小文件合并:小文件过多时,合并小文件,减少map个数
set hive.input.format= org.apache.hadoop.hive.ql.io.CombineHiveInputFormat;
- 复杂文件增加map数:input的文件很大时,可以增加map数,减少单个map要处理的文件大小
computeSliteSize(Math.max(minSize,Math.min(maxSize,blocksize)))=blocksize
降低maxSize可以增加map个数
-
设置合理的reduce数
处理大数据量利用合适的reduce数;使单个reduce任务处理数据量大小要合适;