我想加入2个hive表。以下陈述之间是否存在性能差异?
basic_info的列:user_id,姓名,姓氏,生日,职业
account_info的列:user_id,account_id,type,balance
查询1:
SELECT b.user_id, a.account_id, b.name, b.lastname, a.balance
FROM account_info a
JOIN basic_info b
ON a.user_id = b.user_id
WHERE b.occupation = 'lawyer'
QUERY2:
SELECT b.user_id, a.account_id, b.name, b.lastname, a.balance
FROM account_info a
JOIN
(SELECT user_id, name, lastname
FROM basic_info
WHERE occupation = 'lawyer') b
ON a.user_id = b.user_id
对我来说,第二个看起来更高效。但我找不到一个明确的说法。我在Apache的网站上发现的最近的事情是:
https://cwiki.apache.org/confluence/display/Hive/LanguageManual+Joins
在有条款的情况下发生联接。因此,如果要限制连接的OUTPUT,则需求应该在WHERE子句中,否则它应该在JOIN子句中。这个问题的一个主要问题是分区表。
但它给出的例子是分区不适用于这种情况。是否有正式文件表明查询2是否更好?
答案 0 :(得分:1)
是的,Query-2应该运行得很快。如前所述,join在where子句之前发生。
但是你的官方文件问题 - Hive中有一个Predicate下推选项。默认情况下,此选项设置为false。可以使用
将其设置为true设置hive.optimize.ppd = true;
当此选项设置为true时,连接发生在where子句之后。在您的情况下,如果您将此属性设置为' True',则您的查询应同时完成。当属性设置为false(默认行为)时,查询2应该快速完成。
由于HIVE具有谓词下推的显式属性,我们可以得出结论,当属性设置为false时,在where子句之前发生了连接。
答案 1 :(得分:0)
有多种方法可以编写这个sql。虽然,您的两个查询都返回相同的输出,但内部执行计划不同,并且执行时间可能有很大差异。
Hive explain command非常适合从调试和理解场景背后的查询执行计划开始。我希望explain命令可以帮助你找出两个命令之间的差异。
其他因素,Hive Map Joins and SMB(Sort-Merge-Bucket)提高了连接效率。