学习 Spark 2(九):连接操作

实现

Spark SQL 的 JOIN 实现有三种:

  • Sort Merge Join 排序合并连接
  • Hash Join 哈希连接
  • Broadcast Join 广播连接

其中,Sort Merge Join 和 Hash Join 是 Shuffled Join。 Shuffled Join 的实现是在 shuffle 之后,符合 join 条件的数据在同一个分区中,Sort Merge Join 和 Hash Join 的区别是使用了不同的分区算法。

Broadcast Join 是 MapJoin,因为避免了 shuffle 所以比 Sort Merge Join 和 Hash Join 效率更高。

SORT MERGE JOIN

Sort Merge Join 分区算法的思想是:根据键值对分区进行排序,在 shuffle 阶段,相同范围的数据被分配到同一个分区。

HASH JOIN

Hash Join 分区算法的思想是:根据键值对分区进行哈希,子 shuffle 阶段,相同哈希值的数据被分配到同一个分区。

BROADCAST JOIN

Broadcast Join 的思想是:将小表广播到所有 worker 节点,在 map 端与大表执行 join 操作。

JOIN

表 t1:

c0 c1
a b
c d

表 t2:

c0 c2
a c
b d

INNER JOIN

内连接(INNER JOIN)只保留条件为真的左表和右表值。

SQL 语句:

select  
    t1.c0, t1.c1, t2.c0, t2.c2
from t1 join t2  
on t1.c0 = t2.c0  

查询结果:

a,b,a,c  

OUTTER JOIN

外连接(OUTTER JOIN)又分为:左外连接(LEFT OUTTER JOIN)、右外连接(RIGHT OUTTER JOIN)和全连接(FULL OUTTER JOIN)。

LEFT OUTTER JOIN

左外连接(LEFT OUTTER JOIN)左表为主表,只保留条件为真的右表值,条件为假值为 NULL。

SQL 语句:

select  
    t1.c0, t1.c1, t2.c0, t2.c2
from t1 left join t2  
on t1.c0 = t2.c0  

查询结果:

a,b,a,c  
c,d,null,null  
RIGHT OUTTER JOIN

右外连接(RIGHT OUTTER JOIN)右表为主表,只保留条件为真的左表值,条件为假值为 NULL。

SQL 语句:

select  
    t1.c0, t1.c1, t2.c0, t2.c2
from t1 right join t2  
on t1.c0 = t2.c0  

查询结果:

a,b,a,c  
null,null,b,d  
FULL OUTTER JOIN

全连接(RIGHT OUTTER JOIN)保留左表和右表所有值,条件为假值为 NULL。

SQL 语句:

select  
    t1.c0, t1.c1, t2.c0, t2.c2
from t1 full outter join t2  
on t1.c0 = t2.c2  

查询结果:

a,b,a,c  
c,d,null,null  
null,null,b,d  

NATURE JOIN

自然连接(NATURE JOIN)对左表和右表名称相等的列做等值内连接。

SQL 语句:

select  
    t1.c0, t1.c1, t2.c0, t2.c2
from t1 nature join t2  

查询结果:

a,b,a,c  

CROSS JOIN

交叉连接(CROSS JOIN)对左表和右表做笛卡尔积。

SQL 语句:

select  
    t1.c0, t1.c1, t2.c0, t2.c2
from t1 cross join t2  

查询结果:

a,b,a,c  
a,b,b,d  
c,d,a,c  
c,d,b,d  

LEFT SEMI JOIN

左半连接(LEFT SEMI JOIN)并不包含右表的值,相当于使用右表过滤左表。

select  
    t1.c0, t1.c1
from t1 left semi join t2  
on t1.c0 = t2.c0  

相当于

select  
    t1.c0, t1.c1
from t1  
where t1.c0 exist (  
    select
        t2.c0
    from t2
) t2

LEFT ANTI JOIN

左半连接(LEFT SEMI JOIN)与左半连接恰好相反。

select  
    t1.c0, t1.c1
from t1 left anti join t2  
on t1.c0 = t2.c0  

相当于

select  
    t1.c0, t1.c1
from t1  
where t1.c0 not exist (  
    select
        t2.c0
    from t2
) t2

参考