1. join 优化

1.1 小表 join 大表

  • 将小表加载到内存

    1.2 大表 join 大表

  • 两大表进行数据分桶

  • 每个表的分桶数不要超过所有机器cpu核数之和

    2. group by 优化

    2.1 数据倾斜

    这些参数并不是设置为 true 常驻,而是根据不同的任务来灵活调整的

1. 开启 Map 端聚合参数设置

  1. 是否在 Map 端进行聚合:

set hive.map.aggr=true

  1. 在 Map 端进行聚合操作的条目数:

set hive.groupby.mapaggr.checkinterval=100000

  1. 有数据倾斜的时候进行负载均衡:

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; ```