Spark-SQL联接是否创建了所有组合?
这个问题是针对Spark的,但我假设(?)它可能更通用于任何SQL表联接 假设我们有表A和表B。然后我们发出以下命令:Spark-SQL联接是否创建了所有组合?,sql,apache-spark,apache-spark-sql,Sql,Apache Spark,Apache Spark Sql,这个问题是针对Spark的,但我假设(?)它可能更通用于任何SQL表联接 假设我们有表A和表B。然后我们发出以下命令: select a.* from a inner join b on a.col1 - b.col1 <= 0.5 从a.col1-b.col1上的内部联接b中选择a.*Yes。不能优化不基于值相等(用户定义函数调用的结果、在不同表的列上计算的值以及非相等比较运算符)的联接条件,并将其作为笛卡尔乘积和选择进行计算 如果检查结果执行计划,很容易确认这一点。例如: impor
select a.* from a inner join b on a.col1 - b.col1 <= 0.5
从a.col1-b.col1上的内部联接b中选择a.*Yes。不能优化不基于值相等(用户定义函数调用的结果、在不同表的列上计算的值以及非相等比较运算符)的联接条件,并将其作为笛卡尔乘积和选择进行计算
如果检查结果执行计划,很容易确认这一点。例如:
import org.apache.spark.sql.functions_
spark.range(1000)。选择(rand()作为“col1”)。createOrReplaceTempView(“a”)
spark.range(1000)。选择(rand()作为“col1”)。createOrReplaceTempView(“b”)
spark.sql("从a.col1-b.col1上的内部联接b中选择a.*,因此,如果联接条件为b.col1==b.col1,则不会创建笛卡尔积并对联接进行优化?如上所述,结果实际上与执行两个步骤相同-笛卡尔积后接过滤器?是的,可以优化相等联接。第二个问题的答案是肯定的-请检查附加的执行计划。我了解到,关闭广播连接是处理此类查询的最佳方法。根据数据大小,它可能会提高或降低实际性能,但从总体上看,无论您选择哪个选项,它仍然是O(N^2)。