转换 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