优化 HIVE 查询中的连接:c
Posted
技术标签:
【中文标题】优化 HIVE 查询中的连接:c【英文标题】:Optimize join in HIVE query: c 【发布时间】:2014-10-16 12:34:12 【问题描述】:我想知道哪一个是优化连接这三个可能候选者中的两个表的 HIVE (0.12) 查询的最佳方法(并且可能理解为什么):
SELECT * FROM a join b ON (a.id = b.id) WHERE b.dt = "2014-09-01";
或
SELECT * FROM a JOIN b ON (a.id = b.id AND b.dt = "2014-09-01") ;
或
SELECT * FROM a JOIN (
SELECT * FROM b where dt = "2014-09-01" ) c
ON a.id = c.id ;
我无法控制表的存储和分区方式,所以我的问题更多的是关于 一般最佳实践比特定案例。我确定 a.id = b.id 只有在 b.dt = '2014-09-01' 时才有可能,所以我想限制可以连接的数据以提高速度(b 是一个巨大的表) .
阅读 HIVE 文档我了解到,通常最好 a 是最小的表,b 是(非常)大的表;但是我无法理解 上面显示的不同查询会根据性能表现。
如果有其他方法我可以使用,我也想知道。
【问题讨论】:
一张桌子有多大,它适合记忆吗? 我会说我正在使用的这个特殊的可以,一般不,他们不会。 【参考方案1】:我发现这三者在 #of MR-jobs 、使用的映射器和解释计划方面都是相同的。 通过注意表 a 足够小,使用了 map-side join 优化。 通过在表 b 上切换过滤器的位置对用于从表 b 检索数据的映射器数量没有影响。即使表 b 在子查询中也是如此。
如果表 b 恰好在 col dt 上分区,则唯一的优化是分区修剪,我认为与全表扫描相比,这是减少映射器数量的唯一因素。
【讨论】:
以上是关于优化 HIVE 查询中的连接:c的主要内容,如果未能解决你的问题,请参考以下文章