hive:在联接之前在子表中使用where子句是否有性能改进?

6qftjkof  于 2021-06-28  发布在  Hive
关注(0)|答案(2)|浏览(333)

我想加入2个Hive表。以下语句之间是否存在性能差异?
基本信息栏:用户id、姓名、姓氏、生日、职业
帐户信息列:用户id、帐户id、类型、余额
查询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'

查询2:

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
连接出现在where子句之前。因此,如果要限制联接的输出,则要求应该在where子句中,否则应该在join子句中。这个问题的一大困惑是分区表。
但给出的例子是针对分区的,而不是针对这种情况。是否有官方文件建议查询2更好?

zphenhs4

zphenhs41#

有多种方法可以编写这个sql。尽管,两个查询返回相同的输出,但内部执行计划不同,而且执行时间可能有显著差异。
hiveexplain命令是从调试和理解查询执行计划开始的好地方。我希望解释命令能帮助你找出两个命令之间的区别。
其他因素,配置单元Map连接和smb(排序合并桶)提高了连接的效率。

t9aqgxwy

t9aqgxwy2#

是的,查询-2应该运行得很快。如前所述,join出现在where子句之前。
但是对于你在官方文件中的问题-在hive中有一个 predicate 下推选项。默认情况下,此选项设置为false。可以使用
设置hive.optimize.ppd=true;
当此选项设置为true时,连接发生在where子句之后。在您的例子中,如果您将这个属性设为'true',您的两个查询应该同时完成。当属性设置为false(默认行为)时,查询2应该很快完成。
因为hive有一个predicate push down的显式属性,所以当属性设置为false时,我们可以断定join发生在where子句之前。

相关问题