broadcast join
spark.sql.autoBroadcastJoinThreshold
所配置的值,默认是10M,当某一张表的大小小于这个值时,将这张表收集到driver,然后广播到每一个executor上,这样的好处就是,大表进行join的时候,按照分区划分为多个partition,然后每一个partition与executor上的小表进行连接,小表全程都是存放在内存中,没有进行磁盘io的,速度就快。注意:将 spark.sql.autoBroadcastJoinThreshold 参数设置为 -1,可以关闭这种连接方式;只能用于等值 Join,不要求参与 Join 的 keys 可排序 。
shuffle hash join
因为被广播的表首先被collect到driver段,然后被冗余分发到每个executor上,所以当表比较大时,采用broadcast join会对driver端和executor端造成较大的压力。这个使用场景就是大表连接小表,比上面的那张表要大一些,具体的操作就是两张表,一张为streamlter(迭代器的形式)也是大表(左边),buildlter就是小表,这里的话,分区内的数据无需排序,因为右边的分区的数据都会放在hashmap中,其实就是内存里(如果内存放不下会dump到磁盘中),然后也是会和左边大表合并,遇见相同的join key就合并成一条新数据。那么为神马要进行分区呢,主要是有分区的话就可以进行并行计算,和广播的方式对比,其实就是小表也进行了分区,根据分区,大表和小表有相同分区的分配到同一个executor上,然后和