Spark SQL如何优化连接?什么是优化技巧?

时间:2017-06-08 08:44:11

标签: apache-spark apache-spark-sql

我试图了解spark 2.0如何适用于DataFrame API 作为一个DataFrame,spark知道数据的结构。

  1. 将大表加入小表时我明白播放较小的表是个好主意

  2. 然而,当把大桌子加入大桌子时,有哪些优化技巧?排序有帮助吗?或者火花会在内部进行排序?我应该何时重新分配数据?

  3. 任何解释都会有所帮助

1 个答案:

答案 0 :(得分:0)

免责声明:我在这个优化联接查询的领域仍然是新手,所以请耐心等待。

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

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

  1. BroadcastHashJoinExec当左侧或右侧加入方可以广播时(即小于spark.sql.autoBroadcastJoinThreshold,默认为10M

  2. ShuffledHashJoinExec禁用spark.sql.join.preferSortMergeJoin并且可以为左侧或右侧连接方(需求之间)构建哈希映射

  3. SortMergeJoinExec当左连接键为" orderable"

  4. BroadcastNestedLoopJoinExec当没有加入密钥且可以广播左右加入方时

  5. CartesianProductExec当内部或交叉连接时没有连接条件

  6. 当没有其他人匹配时,
  7. BroadcastNestedLoopJoinExec

  8. 正如你所看到的那样,很多理论要消化为"那里有什么优化技巧"

      

    排序有帮助吗?

    是。请参阅SortMergeJoinExec运营商。

      

    或者火花会在内部进行排序吗?

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

      

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

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

    我还认为对数据进行重新分区对基于成本的优化特别有帮助,其中表修剪可以减少列数和行数,反过来表格大小和一个连接的成本通常会超过其他人。 / p>