Spark函数之join、leftOuterJoin、rightOuterJoin和fullOuterJoin

本文通过两个具体的Pair RDD示例,详细介绍了Spark中不同类型的Join操作(如leftOuterJoin、rightOuterJoin及fullOuterJoin)的使用方法及其返回结果的特点。这些Join操作对于处理大规模数据集时的数据整合至关重要。

join用于内连接。

后三个函数用于类似于SQL的左、右、全连接。

针对key-value形式的RDD。

1
2
3
4
5
val pairRDD1 = sc.parallelize(List( ("cat",2), ("cat", 5), ("book", 4),("cat", 12)))
val pairRDD2 = sc.parallelize(List( ("cat",2), ("cup", 5), ("mouse", 4),("cat", 12)))
pairRDD1.leftOuterJoin(pairRDD2).collect
pairRDD1.rightOuterJoin(pairRDD2).collect
pairRDD1.fullOuterJoin(pairRDD2).collect
pairRDD1:

("cat",2), 
("cat", 5),
("book", 4),
("cat", 12)

pairRDD2:

("cat",2), 
("cup", 5), 
("mouse", 4),
("cat", 12)

leftOuterJoin结果: 

(cat,(2,Some(2))), 
(cat,(2,Some(12))), 
(cat,(5,Some(2))), 
(cat,(5,Some(12))), 
(cat,(12,Some(2))),
(cat,(12,Some(12))), 
(book,(4,None))

rightOuterJoin结果:

(cup,(None,5)), 
(cat,(Some(2),2)), 
(cat,(Some(2),12)), 
(cat,(Some(5),2)), 
(cat,(Some(5),12)), 
(cat,(Some(12),2)), 
(cat,(Some(12),12)), 
(mouse,(None,4))

fullOuterJoin结果:

(cup,(None,Some(5))), 
(cat,(Some(2),Some(2))), 
(cat,(Some(2),Some(12))), 
(cat,(Some(5),Some(2))), 
(cat,(Some(5),Some(12))), 
(cat,(Some(12),Some(2))), 
(cat,(Some(12),Some(12))), 
(book,(Some(4),None)), 
(mouse,(None,Some(4)))
leftOuterJoin rightOuterJoinSpark 中两种常用的连接操作,它们分别表示左外连接右外连接。 leftOuterJoin 操作会将左侧的 RDD 中的每个键都保留下来,并将右侧的 RDD 中与之对应的键的值与之连接。如果右侧的 RDD 中不存在与某个键对应的键值对,那么在连接结果中就会出现该键在右侧 RDD 中对应值为 None 的项。 rightOuterJoin 操作与 leftOuterJoin 相反,它会将右侧的 RDD 中的每个键都保留下来,并将左侧的 RDD 中与之对应的键的值与之连接。如果左侧的 RDD 中不存在与某个键对应的键值对,那么在连接结果中就会出现该键在左侧 RDD 中对应值为 None 的项。 举个例子,假设有两个 RDD: ```scala val rdd1 = sc.parallelize(Seq(("a", 1), ("b", 2), ("c", 3))) val rdd2 = sc.parallelize(Seq(("b", 4), ("c", 5), ("d", 6))) ``` 对这两个 RDD 进行 leftOuterJoin 操作: ```scala val joinResult = rdd1.leftOuterJoin(rdd2) ``` 得到的连接结果为: ``` (a, (1, None)), (b, (2, Some(4))), (c, (3, Some(5))) ``` 可以看到,rdd1 中的每个键都保留下来了,并将 rdd2 中与之对应的键的值与之连接。由于 rdd2 中不存在与键为 a 对应的键值对,因此在连接结果中出现了 (a, (1, None)) 这一项。 对这两个 RDD 进行 rightOuterJoin 操作: ```scala val joinResult = rdd1.rightOuterJoin(rdd2) ``` 得到的连接结果为: ``` (b, (Some(2), 4)), (c, (Some(3), 5)), (d, (None, 6)) ``` 可以看到,rdd2 中的每个键都保留下来了,并将 rdd1 中与之对应的键的值与之连接。由于 rdd1 中不存在与键为 d 对应的键值对,因此在连接结果中出现了 (d, (None, 6)) 这一项。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值