在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中选择”优化查询?)
答案 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年。)