2017-06-08 86 views
3

我想了解spark 2.0如何适用于DataFrame API 作为一个DataFrame,spark具有关于数据结构的知识。Spark SQL如何优化连接?什么是优化技巧?

  1. 当加入大表到小表据我所知,广播较小的表是一个好主意

  2. 然而到大表连接大表的时候,有什么优化技巧有哪些?排序是否有帮助?或者会触发内部排序?我应该何时对数据进行重新分区?

任何解释将有助于

回答

0

免责声明:我仍然在这方面的优化连接查询,以便把它当作一粒盐的新手。


星火SQL附带有转换逻辑加入到支持的连接物理运算符的一个JoinSelection执行规划策略(每加入物理运算符的选择要求)。

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

  1. BroadcastHashJoinExec向左或向右连接侧可以广播时(即,比spark.sql.autoBroadcastJoinThreshold小,这是10M默认情况下)

  2. ShuffledHashJoinExecspark.sql.join.preferSortMergeJoin被禁用,并且可以为左侧或右侧联接侧(需求之间)构建散列映射图

  3. SortMergeJoinExec左连接键时出现“订购”

  4. BroadcastNestedLoopJoinExec当没有加入键和左或右连接侧可以广播

  5. CartesianProductExec时,它的内部或无交叉加盟加盟条件

  6. BroadcastNestedLoopJoinExec在没有其他具有匹配

正如你可以看到有很多的理论与二“有哪些优化技巧”

排序是否有帮助?

是的。请参阅SortMergeJoinExec运营商。

或者会触发内部排序吗?

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

什么时候应该重新分区数据?

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

我还认为,对数据进行重新分区对于基于成本的优化具有特别的帮助,其中表格修剪可以减少列和行的数量,并且反过来也可以减少表格大小和一个连接的成本。