蜂巢 - 从没有加入的两张桌子中抓取

时间:2013-11-18 22:30:42

标签: optimization join hive multiple-tables

在MySQL中,我可以从两个表中选择而不需要一个连接,如下所示:

SELECT t1.value, t2.value FROM t1, t2 WHERE (t1.value = t2.value);
另一方面,Hive会接受“FROM t1 join t2”但“FROM t1,t2”。)

有没有人对如何优化像

这样的查询有任何想法
SELECT t1.value, t2.value FROM t1 join t2 WHERE (t1.value = t2.value);

以任何其他方式?

(另外,为什么在MySQL中从“从t1加入t2选择”切换到“从t1,t2中选择”优化查询?)

1 个答案:

答案 0 :(得分:2)

为什么不想使用加入?从两个表中进行选择并要求它们之间存在一些相等性,这会导致内部联接。

此外,使用您正在使用的联接,您将创建两个表的笛卡尔积并删除那些t1.value=t2.value的记录。直接使用内部联接会更有效:

SELECT t1.value, t2.value FROM t1 JOIN t2 ON t1.value=t2.value;

如果您的某张桌子非常小,您可以进行地图侧连接。小表将缓存在内存中,而较大的表可以流式传输,并且不需要减少步骤。要激活映射端连接,必须在执行查询之前执行set hive.auto.convert.join=true;。映射端连接的最大表大小(以字节为单位)的阈值在属性hive.mapjoin.smalltable.filesize中设置。

(来源:Edward Capriolo,Dean Wampler和Jason Rutherglen。编程Hive。 O'Reilly,2012年。)