一、join 优化
Join 查找操作的基本原则:应该将条目少的表/子查询放在 Join 操作符的左边。原因
是在 Join 操作的 Reduce 阶段,位于 Join 操作符左边的表的内容会被加载进内存,将
条目少的表放在左边,可以有效减少发生内存溢出错误的几率。
Join 查找操作中如果存在多个 join,且所有参与 join 的表中其参与 join 的 key 都相
同,则会将所有的 join 合并到一个 mapred 程序中。
案例:
SELECT a.val, b.val, c.val FROM a JOIN b ON (a.key = b.key1) JOIN c ON
(c.key = b.key1) 在一个 mapre 程序中执行 join
SELECT a.val, b.val, c.val FROM a JOIN b ON (a.key = b.key1) JOIN c ON
(c.key = b.key2) 在两个 mapred 程序中执行 join
Map join 的关键在于 join 操作中的某个表的数据量很小,案例:
SELECT /*+ MAPJOIN(b) */ a.key, a.value
FROM a join b on a.key = b.key
Mapjoin 的限制是无法执行 a FULL/RIGHT OUTER JOIN b,和 map join 相关的
hive 参数:hive.join.emit.interval hive.mapjoin.size.key
hive.mapjoin.cache.numrows
由于 join 操作是在 where 操作之前执行,所以当你在执行 join 时,where 条件并不
能起到减少 join 数据的作用;案例:
SELECT a.val, b.val FROM a LEFT OUTER JOIN b ON (a.key=b.key)
评论