优化 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的主要内容,如果未能解决你的问题,请参考以下文章

比较 Hive 查询与不同连接顺序的效率

hive大表和小表MapJoin关联查询优化

Presto统计信息

优化配置单元中的多个连接

Hive sql中的 各种join(内连接左外连接右外连接满外连接)

Hive sql中的 各种join(内连接左外连接右外连接满外连接)