我试图了解spark 2.0如何适用于DataFrame API 作为一个DataFrame,spark知道数据的结构。
将大表加入小表时我明白播放较小的表是个好主意
然而,当把大桌子加入大桌子时,有哪些优化技巧?排序有帮助吗?或者火花会在内部进行排序?我应该何时重新分配数据?
任何解释都会有所帮助
答案 0 :(得分:0)
免责声明:我在这个优化联接查询的领域仍然是新手,所以请耐心等待。
Spark SQL附带JoinSelection执行计划策略,该策略将逻辑连接转换为支持的连接物理运算符之一(每个连接物理运算符选择要求)。
有6种不同类型的物理连接运算符:
BroadcastHashJoinExec
当左侧或右侧加入方可以广播时(即小于spark.sql.autoBroadcastJoinThreshold
,默认为10M
)
ShuffledHashJoinExec
禁用spark.sql.join.preferSortMergeJoin
并且可以为左侧或右侧连接方(需求之间)构建哈希映射
SortMergeJoinExec
当左连接键为" orderable"
BroadcastNestedLoopJoinExec
当没有加入密钥且可以广播左右加入方时
CartesianProductExec
当内部或交叉连接时没有连接条件
BroadcastNestedLoopJoinExec
正如你所看到的那样,很多理论要消化为"那里有什么优化技巧" 。
排序有帮助吗?
是。请参阅SortMergeJoinExec
运营商。
或者火花会在内部进行排序吗?
它会尝试,但人类可以(仍然?)创造奇迹。
我应该何时重新分配数据?
如果可以,并且知道修剪可以提供帮助。这可以减少要处理的行数,并有效地允许BroadcastHashJoinExec
超过ShuffledHashJoinExec
或其他行。
我还认为对数据进行重新分区对基于成本的优化特别有帮助,其中表修剪可以减少列数和行数,反过来表格大小和一个连接的成本通常会超过其他人。 / p>