Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/apache-spark/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angular/29.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Spark-SQL联接是否创建了所有组合?_Sql_Apache Spark_Apache Spark Sql - Fatal编程技术网

Spark-SQL联接是否创建了所有组合?

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

这个问题是针对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。不能优化不基于值相等(用户定义函数调用的结果、在不同表的列上计算的值以及非相等比较运算符)的联接条件,并将其作为笛卡尔乘积和选择进行计算

如果检查结果执行计划,很容易确认这一点。例如:

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)。