一、JOIN多表关联
1.提前过滤——使用谓词下推
使用from子句方式的语句结构(即select子句);
注意:当多表关联使用inner join或left join时,主表的过滤条件可不用select子句的形式放在from后,而是放到最后的where条件里同样可使谓词下推生效。
2.提前聚合
在多表关联时涉及数据聚合,尽量将低粒度的子句提前聚合后再关联,而非发散关联后放到最后聚合。
3.小表在前
HIVE会自动将前面的小表直接放入缓存中,不用开启MAPREDUCE任务。
开启map join优化:
可将小表缓存在map端完成join过程,从而省略掉reduce端的工作。
set hive.auto.convert.join = true
默认是false
set hive.mapjoin.smalltable.filesize = 25000000;
默认值25M,设置使用这个优化的小表的大小
二、数据倾斜
原因:某个键下包含的数据量过多,导致处理该键下的数据的reduce任务负担过重,相对其他reduce任务过于耗时。
发生场景1:group by或join关联时导致Key值分布不均匀。
解决方案:
1.如果是因为有大量的NULL值和空值,则因提前过滤掉。
2.限制单个Reduce任务处理数据块的大小:
set hive.exec.reducers.bytes.per.reducer = 1000000000;
每个节点的reduce默认是处理1G大小的数据(从Hive 0.14.0开始,默认值变成了256M)