优化
- 列裁剪(
Column Pruning
)
读取数据时,只读取需要用到的列,而忽略其他列。例如:SELECT a,b FROM t WHERE e<10;
- 分区裁剪(
Partition Pruning
)
在查询过程中减少不必要的分区。例如:SELECT * FROM (SELECT c1, COUNT(1) FROM T GROUP BY c1) subq WHERE subq.prtn=100;
要实现分区裁剪,须设置hive.optimize.pruner=true
-
Join
操作
进行JOIN
操作时,应将记录少的表/子查询放在Join
操作符的左边。
对于一条语句中有多个Join
的情况,如果Join
的条件相同,不管有多少个表,都会合并成为一个MapReduce
-
Map Join
操作
Map Join
操作无须reduce
操作就可以在map
阶段全部完成,前提是在map
过程中可以访问到全部需要的数据。例如:INSERT OVERWRITE TABLE pv_users SELECT pv.pageid,u.age FROM user u ON (pv.userid=u.userid);
-
Group By
操作
Map
端部分聚合。很多聚合操作都可以先在map端进行部分聚合,然后在reduce
端得出最终结果。相关参数:hive.map.aggr=true,hive.groupby.mapaggr.checkinterval=100000
有数据倾斜(数据分布不均匀)时进行负载均衡。相关参数:hive.groupby.skewindata=true
(默认为false
) - 合并小文件
相关的参数:hive.merge.mapfiles=true,hive.merge.mapredfiles=true
(默认false
),hive.merge.size.per.task=256000000
网友评论