我有一个看起来像
的查询select * from t1 inner join t2 on t1.c1 = t2.c1
inner join t3 on t2.c2 = t3.c2
inner join t4 on t3.c3 = t4.c3
where t3.c4 = value
我很想知道操作的顺序是什么:
(1)将执行所有内部联接,之后将选择具有t3.c4 = value
的列
(2)而不是使用t3进行连接,实际上(第一次)使用t3.c4 = value
的表进行连接。即,首先创建t3.c4 = value
的临时表(t3tmp
),之后将执行所有内部联接,而不是使用t3
t3tmp
答案 0 :(得分:0)
考虑在DataFrame上使用explain方法或查看Spark UI以获得有关特定案例如何优化的更多信息。
应该是Spark 1.6的第二个选项(尽管它可能取决于条件本身)。
t3.c4条件很可能在加入之前被推入t3结果。
有关Spark如何处理它的更多信息,请参见SPARK-12532 Jira票证和相关的pull request。
上面提到的变化似乎被延迟了,并没有合并到1.6。
至于连接的顺序,据我所知,有一个计划是添加一个基于成本的优化器来实际规划哪个连接应该先行,但它还没有实现。
此时,我只能找到这张SPARK-12602 Jira票,其中提到外/内连接重新排序(还有一些其他票也适用于其他案例)。