【问题标题】:Spark - SQL Joins Does all Combinations Get Created?Spark - SQL 连接是否创建了所有组合?
【发布时间】:2018-04-10 22:00:01
【问题描述】:

这个问题是针对 Spark 的,但我假设(?)它可能对任何 SQL 表连接都更通用。

假设我们有表 A 和 B。然后我们发出这个命令:

select a.* from a inner join b on a.col1 - b.col1 <= 0.5

在幕后,首先创建一个笛卡尔积,然后根据 a.col1 - b.col1

【问题讨论】:

    标签: sql apache-spark apache-spark-sql


    【解决方案1】:

    是的。不基于相等值(用户定义的函数调用的结果、在不同表中的列上计算的值以及不相等的比较运算符)的连接条件无法优化,并且被评估为笛卡尔积,然后是选择。

    如果您检查生成的执行计划,很容易确认。例如:

    import org.apache.spark.sql.functions._
    
    spark.range(1000).select(rand() as "col1").createOrReplaceTempView("a")
    spark.range(1000).select(rand() as "col1").createOrReplaceTempView("b")
    
    spark.sql("select a.* from a inner join b on a.col1 - b.col1 <= 0.5").explain
    // == Physical Plan ==
    // *Project [col1#9]
    // +- BroadcastNestedLoopJoin BuildRight, Inner, ((col1#9 - col1#16) <= 0.5)
    //    :- *Project [rand(3279117551830311353) AS col1#9]
    //    :  +- *Range (0, 1000, step=1, splits=4)
    //    +- BroadcastExchange IdentityBroadcastMode
    //       +- *Project [rand(-3185472069145487350) AS col1#16]
    //          +- *Range (0, 1000, step=1, splits=4)
    

    如果您禁用广播连接,则类似:

    spark.conf.set("spark.sql.autoBroadcastJoinThreshold", -1)
    
    spark.sql("select a.* from a inner join b on a.col1 - b.col1 <= 0.5").explain
    // == Physical Plan ==
    // *Project [col1#9]
    // +- CartesianProduct ((col1#9 - col1#16) <= 0.5)
    //    :- *Project [rand(3279117551830311353) AS col1#9]
    //    :  +- *Range (0, 1000, step=1, splits=4)
    //    +- *Project [rand(-3185472069145487350) AS col1#16]
    //       +- *Range (0, 1000, step=1, splits=4)
    

    【讨论】:

    • 那么如果连接条件是 b.col1 == b.col1 那么没有创建笛卡尔积并且优化连接?如上所述,结果实际上与执行 2 个步骤相同 - 笛卡尔积后跟过滤器?
    • 是的,可以优化等式连接。第二个问题的答案是肯定的——请检查附加的执行计划。
    • 我读到关闭广播连接是处理此类查询的最佳选择。
    • 根据数据的大小,它可能会提高或降低实际性能,但从大局来看,无论您选择哪个选项,它仍然是 O(N^2)。
    猜你喜欢
    • 1970-01-01
    • 2017-06-28
    • 1970-01-01
    • 2023-04-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多