【问题标题】:How does Spark SQL optimize joins? What are the optimization tricks?Spark SQL 如何优化连接?有哪些优化技巧?
【发布时间】:2018-01-23 22:16:44
【问题描述】:

我正在尝试了解 spark 2.0 如何用于 DataFrame API 作为 DataFrame,spark 了解数据的结构。

  1. 将大表连接到小表时,我知道广播较小的表是个好主意

  2. 但是,在将大表加入大表时,有哪些优化技巧?排序有帮助吗?或者会在内部进行排序?我应该何时重新分区数据?

任何解释都会有所帮助

【问题讨论】:

    标签: apache-spark apache-spark-sql


    【解决方案1】:

    免责声明:我在优化连接查询方面仍然是新手,所以请谨慎对待。


    Spark SQL 附带 JoinSelection 执行计划策略,可将逻辑连接转换为支持的连接物理运算符之一(根据连接物理运算符选择要求)。

    有 6 种不同类型的物理连接运算符:

    1. BroadcastHashJoinExec 可以广播左或右连接边(即小于spark.sql.autoBroadcastJoinThreshold,默认为10M

    2. ShuffledHashJoinExecspark.sql.join.preferSortMergeJoin 被禁用并且可以为左或右连接侧构建哈希映射(在要求中)

    3. SortMergeJoinExec 当左连接键是“可排序的”时

    4. BroadcastNestedLoopJoinExec当没有加入键且可以广播左右加入边时

    5. CartesianProductExec 当它是无连接条件的内连接或交叉连接时

    6. BroadcastNestedLoopJoinExec 当没有其他匹配时

    如您所见,“有哪些优化技巧”需要消化很多理论。

    排序有帮助吗?

    是的。请参阅SortMergeJoinExec 运算符。

    或者 spark 会在内部进行排序?

    它会尝试,但人类可以(仍然?)创造奇迹。

    我应该何时重新分区数据?

    如果可以并且知道修剪可以提供帮助,请始终这样做。这可以减少要处理的行数,并有效地允许BroadcastHashJoinExec 超过ShuffledHashJoinExec 或其他。

    我还认为,对数据进行重新分区对于基于成本的优化特别有帮助,在这种优化中,表修剪可以减少列和行的数量,进而减少表的大小和一个连接相对于其他连接的成本。

    【讨论】:

      猜你喜欢
      • 2010-11-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-05-18
      • 1970-01-01
      • 2010-12-24
      相关资源
      最近更新 更多