【发布时间】:2018-01-23 22:16:44
【问题描述】:
我正在尝试了解 spark 2.0 如何用于 DataFrame API 作为 DataFrame,spark 了解数据的结构。
将大表连接到小表时,我知道广播较小的表是个好主意
但是,在将大表加入大表时,有哪些优化技巧?排序有帮助吗?或者会在内部进行排序?我应该何时重新分区数据?
任何解释都会有所帮助
【问题讨论】:
标签: apache-spark apache-spark-sql
我正在尝试了解 spark 2.0 如何用于 DataFrame API 作为 DataFrame,spark 了解数据的结构。
将大表连接到小表时,我知道广播较小的表是个好主意
但是,在将大表加入大表时,有哪些优化技巧?排序有帮助吗?或者会在内部进行排序?我应该何时重新分区数据?
任何解释都会有所帮助
【问题讨论】:
标签: apache-spark apache-spark-sql
免责声明:我在优化连接查询方面仍然是新手,所以请谨慎对待。
Spark SQL 附带 JoinSelection 执行计划策略,可将逻辑连接转换为支持的连接物理运算符之一(根据连接物理运算符选择要求)。
有 6 种不同类型的物理连接运算符:
BroadcastHashJoinExec 可以广播左或右连接边(即小于spark.sql.autoBroadcastJoinThreshold,默认为10M)
ShuffledHashJoinExec 当spark.sql.join.preferSortMergeJoin 被禁用并且可以为左或右连接侧构建哈希映射(在要求中)
SortMergeJoinExec 当左连接键是“可排序的”时
BroadcastNestedLoopJoinExec当没有加入键且可以广播左右加入边时
CartesianProductExec 当它是无连接条件的内连接或交叉连接时
BroadcastNestedLoopJoinExec 当没有其他匹配时
如您所见,“有哪些优化技巧”需要消化很多理论。
排序有帮助吗?
是的。请参阅SortMergeJoinExec 运算符。
或者 spark 会在内部进行排序?
它会尝试,但人类可以(仍然?)创造奇迹。
我应该何时重新分区数据?
如果可以并且知道修剪可以提供帮助,请始终这样做。这可以减少要处理的行数,并有效地允许BroadcastHashJoinExec 超过ShuffledHashJoinExec 或其他。
我还认为,对数据进行重新分区对于基于成本的优化特别有帮助,在这种优化中,表修剪可以减少列和行的数量,进而减少表的大小和一个连接相对于其他连接的成本。
【讨论】: