赞
踩
这种方式的好处是可以不用shuffle,可以直接使用广播变量,但是有条件
过程
当右表比较大时,在把右表Broadcast就会有压力
其原理如下图:
上面介绍的两种实现对于一定大小的表比较适用,但当两个表都非常大时,显然无论适用哪种都会对计算内存造成很大压力。这是因为join时两者采取的都是hash join,是将一侧的数据完全加载到内存中,使用hash code取join keys值相等的记录进行连接。
当两个表都非常大时,SparkSQL采用了一种全新的方案来对表进行Join,即Sort Merge Join。这种实现方式不用将一侧数据全部加载后再进星hash join,但需要在join前将数据排序,如下图所示:
SortMergeJoinExec类,主要做几个事情
Cartesian 和 NestedLoopJoin 性能很差,所以一般只有在写不等式join或者cross join的时候会选择这两种策略
Nested Loop Join适用于小表到大表的情况,Spark将迭代表A的每一行并在表B中查找匹配的行。这个过程将不断重复,直到表A的所有行都被处理,需要对表A中的每一行进行一次表B的全表扫描,所以大表表现很差
CartesianJoin 一般用来做笛卡尔积连接
为了避免性能问题,一般会把不等式join转为等式join处理
虽然有上述5 个核心类 / join方式,但是其实对应 Nested-loop Join、Sort-Merge Join 和 Hash Join 3种 join 的思想
注意:Sort-Merge Join 和 Hash Join 只适用于 Equi-Join ( Join 条件均使用等于作为比较算子)。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。