优化HIVE查询中的连接:c

时间:2014-10-16 12:34:13

标签: join hadoop hive query-optimization

我想知道哪一个是优化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 个答案:

答案 0 :(得分:1)

我看到三个在MR作业,使用的映射器和解释计划方面都是相同的。 通过注意表a足够小,使用了映射侧连接优化。 通过切换表b上的过滤器的位置,对用于从表b中检索数据的映射器的数量没有影响。即使表b在子查询中也是如此。

唯一的优化是分区修剪,如果表b碰巧在col dt上进行了分区,我认为这是减少映射器数量的唯一因素,而不是全表扫描。