我有一个看起来像这样的查询
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
请考虑在数据帧上使用说明方法或查看 Spark UI 以获取有关如何优化特定案例的更多知识。
传递连接谓词的下推
应该是 Spark 1.6 的第二个选项(尽管它可能取决于条件本身(。
t3.c4 条件很可能会在连接之前被推送到 t3 结果中。有关 Spark 如何处理它的更多信息,请参阅 SPARK-12532 Jira 票证和相关拉取请求。
编辑 #1
似乎上面提到的更改被推迟了,并且没有合并到 1.6 中。
联接重新排序
至于连接的顺序,据我所知,有一个计划添加一个基于成本的优化器来实际计划哪个连接应该先进行,但它还没有实现。
目前,我只能找到这个 SPARK-12602 Jira 票证,其中提到了外部/内部连接重新排序(在其他情况下还有其他一些票证(。