我想了解spark 2.0如何适用于DataFrame API 作为一个DataFrame,spark具有关于数据结构的知识。Spark SQL如何优化连接?什么是优化技巧?
当加入大表到小表据我所知,广播较小的表是一个好主意
然而到大表连接大表的时候,有什么优化技巧有哪些?排序是否有帮助?或者会触发内部排序?我应该何时对数据进行重新分区?
任何解释将有助于
我想了解spark 2.0如何适用于DataFrame API 作为一个DataFrame,spark具有关于数据结构的知识。Spark SQL如何优化连接?什么是优化技巧?
当加入大表到小表据我所知,广播较小的表是一个好主意
然而到大表连接大表的时候,有什么优化技巧有哪些?排序是否有帮助?或者会触发内部排序?我应该何时对数据进行重新分区?
任何解释将有助于
免责声明:我仍然在这方面的优化连接查询,以便把它当作一粒盐的新手。
星火SQL附带有转换逻辑加入到支持的连接物理运算符的一个JoinSelection执行规划策略(每加入物理运算符的选择要求)。
有6种不同类型的物理连接的运算符:
BroadcastHashJoinExec
向左或向右连接侧可以广播时(即,比spark.sql.autoBroadcastJoinThreshold
小,这是10M
默认情况下)
ShuffledHashJoinExec
时spark.sql.join.preferSortMergeJoin
被禁用,并且可以为左侧或右侧联接侧(需求之间)构建散列映射图
SortMergeJoinExec
左连接键时出现“订购”
BroadcastNestedLoopJoinExec
当没有加入键和左或右连接侧可以广播
CartesianProductExec
时,它的内部或无交叉加盟加盟条件
BroadcastNestedLoopJoinExec
在没有其他具有匹配
正如你可以看到有很多的理论与二“有哪些优化技巧”。
排序是否有帮助?
是的。请参阅SortMergeJoinExec
运营商。
或者会触发内部排序吗?
它会尝试,但人类可以(仍?)创造奇迹。
什么时候应该重新分区数据?
总是如果你能,并知道修剪可以帮助。这可以减少要处理的行数并且有效地允许BroadcastHashJoinExec
超过ShuffledHashJoinExec
或其他。
我还认为,对数据进行重新分区对于基于成本的优化具有特别的帮助,其中表格修剪可以减少列和行的数量,并且反过来也可以减少表格大小和一个连接的成本。