1. join 优化
1.1 小表 join 大表
-
1.2 大表 join 大表
两大表进行数据分桶
- 每个表的分桶数不要超过所有机器cpu核数之和
2. group by 优化
2.1 数据倾斜
这些参数并不是设置为 true 常驻,而是根据不同的任务来灵活调整的
1. 开启 Map 端聚合参数设置
- 是否在 Map 端进行聚合:
set hive.map.aggr=true
- 在 Map 端进行聚合操作的条目数:
set hive.groupby.mapaggr.checkinterval=100000
- 有数据倾斜的时候进行负载均衡:
set hive.groupby.skewindata=true
为 true 时,生成的 MR Job 有两个
- 第一个 MR Job 用来将结果随机分发到不同的 Reduce,每个 Reduce 做部分聚合操作,使得原本相同的 key 的数据分发到不同的 Reduce(达到负载均衡的效果)
- 第二个 MR Job 根据预处理的结果按照 Group By Key 分到同个 Reduce 中
3. Count(Distinct) 去重统计
由于 distinct 的去重操作会使得只能有一个 Reduce Task ,所以可以通过 group by 来优化,在开启多个 reduce 之后,会把 id 通过 hash 分布到对应的 reduce 中,再在最后的 count(*) 统计中过滤出数据: ```sql select count(distinct(id)) from a;
— 优化:
select count(*) from (select id from a group by id) t1; ```