hive3.1.x join优化

转换 mr 任务数量

如果每个表在 on 子句中使用 相同的列,那么 hive 转换为单个 mr 任务

1个mr任务

select a.name,b,name,c.name from a join b on (a.key = b.key1) join c on (c.key = b.key1)

上面sql 中,在 2个 on 子句中,只用到 b.key1,将转换 1个 mr 任务:

2个mr任务

select a.name,b.name,c.name from a join b on (a.key = b.key1) join c on (c.key = b.key2)

上面sql 中,在 2个 on 子句中,用到 b.key1 和 b.key2,将转换 2个 mr 任务:

  • 第1个 mr 任务处理 a 和 b 的连接查询
  • 第2个 mr 任务处理 结果 与 c 的连接查询

大表放在后面

在小表和大表进行join时,将大表放在后面,hive会把其他表先缓存起来,直到扫描最后的表进行计算

select a.name,b.name from a join b on (a.key = b.key1)

解释:

  • a是小表
  • b是大表

mapjoin

有一张表数据量较小,可以存于内存中,这样该表在和其他表 join 时可以直接在 map 端进行,省掉 reduce 过程,效率高。

手动方式(mapjoin)

使用 mapjoin 将小表放入内存,不需要 reduce

select /*+MAPJOIN(b)*/ a.name,b.name from a JOIN b ON a.key=b.key1

自动方式

默认 mapjoin 的表大小是 25MB

set hive.auto.convert.join=true;

select a.a1,a.a2,b.b2 from tablea a JOIN tableb b ON a.a1=b.b1