目录
Map Join
作用
大表 和 小表 关联查询时,提升性能,避免数据倾斜。
触发条件
-- 1、开启MapJoin set hive.auto.convert.join=true; -- 2、设置阈值,不要超出自己的硬件配置,否则内存溢出 set hive.auto.convert.join.noconditionaltask.size=512000000
Bucket-Map Join
作用
大表 和 中表 关联(小表的数据大小超出阈值)时,使用Map端Join优化。
触发条件
1) 开启配置:set hive.optimize.bucketmapjoin = true;
2) 一个表的bucket数是另一个表bucket数的==整数倍==
3) bucket列 == join列 4) 满足map join条件
SMB Join (sort merge bucket)
作用
当大表和大表关联(关联的两个表数据都很大)时使用。
触发条件
- 开启SMB配置
set hive.optimize.bucketmapjoin = true; set hive.auto.convert.sortmerge.join=true; set hive.optimize.bucketmapjoin.sortedmerge = true; set hive.auto.convert.sortmerge.join.noconditionaltask=true;
- bucket列 == join列,且要Sort此列
- 创建表时,sorted by (列);
- 插入数据时:
- cluster by (列);
- hive.enforce.sorting 设置为 true
- 两个表的bucket数==必须相等==
- 满足BucketMapJoin的条件
Join-Skew关联查询时数据倾斜
运行时优化
-- 开启运行时倾斜优化 set hive.optimize.skewjoin=true; -- 设定倾斜阈值 set hive.skewjoin.key=100000; //行数
编译时优化
- 开启编译时优化
set hive.optimize.skewjoin.compiletime=true;
- 建表时指定倾斜字段和倾斜的值
CREATE TABLE list_bucket_single (key STRING, value STRING) -- 倾斜的字段和需要拆分的key值 SKEWED BY (name) ON (‘张三’,’李四’,’王五’) -- 为倾斜值创建子目录单独存放 [STORED AS DIRECTORIES];
Unoin优化
set hive.optimize.union.remove=true;
GroupBy-Skew统计时数据倾斜
Map先行打散
CM中配置hive.map.aggr
MR Job随机数打散
hive.groupby.skewindata=true;
注意:有多个列执行distinct去重操作时,不支持skewindata: