2014-10-16 49 views
0

我想知道哪一个是优化的HIVE的最佳方式(0.12)查询这三种可能的候选人中连接两个表(也可能明白为什么):优化加入HIVE查询:C

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是(非常)大的表;但我不明白上面显示的不同查询在性能方面的表现如何。

如果还有其他方法我可以使用我也想知道它。

+0

桌子有多大,是否适合记忆? – www 2014-10-16 14:08:21

+0

我会说,我正在使用的这个特殊功能,一般情况下不会,他们不会。 – lucacerone 2014-10-16 14:18:02

回答

1

我看到,所有这三个在MR-jobs,mappers和解释计划中都是一样的。 通过注意表a足够小地图侧连接优化被利用。通过切换表b上的过滤器的位置, 对用于从表b检索数据的映射器的数量没有影响。即便表b在子查询中,情况也是如此。

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