RDD关联函数join与leftOuterJoin与rightOuterJoin与fullOuterJoin详解

  • 关联函数
关联函数: 主要是针对KV类型的数据, 根据key进行关联操作

相关的算子:
    join: 实现两个RDD的内连接 (取公共部分)
    leftOuterJoin: 实现两个RDD的左连接(左边RDD的数据都要, 右边进行匹配, 匹配不上用Null)
    rightOuterJoin:实现两个RDD的右连接(右边RDD的数据都要, 左边进行匹配, 匹配不上用Null)
    fullOuterJoin: 实现两个RDD的满外连接(左右两边的RDD数据都要, 匹配不上用null)


准备数据集:
rdd1 = sc.parallelize([('c01','张三'),('c02','李四'),('c01','王五'),('c01','赵六'),('c02','田七'),('c03','周八')])
rdd2 = sc.parallelize([('c01','大数据1期'),('c02','大数据2期'),('c04','大数据4期')])

演示: Join操作:
rdd1.join(rdd2).collect()
结果:
[
    ('c01', ('张三', '大数据1期')), 
    ('c01', ('王五', '大数据1期')), 
    ('c01', ('赵六', '大数据1期')), 
    ('c02', ('李四', '大数据2期')), 
    ('c02', ('田七', '大数据2期'))
]

演示: 左关联 和 右关联
rdd1.leftOuterJoin(rdd2).collect()
结果:
[
    ('c01', ('张三', '大数据1期')), 
    ('c01', ('王五', '大数据1期')), 
    ('c01', ('赵六', '大数据1期')),
    ('c02', ('李四', '大数据2期')), 
    ('c02', ('田七', '大数据2期')), 
    ('c03', ('周八', None))
]

rdd1.rightOuterJoin(rdd2).collect() 
结果
[
    ('c04', (None, '大数据4期')), 
    ('c01', ('张三', '大数据1期')), 
    ('c01', ('王五', '大数据1期')), 
    ('c01', ('赵六', '大数据1期')), 
    ('c02', ('李四', '大数据2期')), 
    ('c02', ('田七', '大数据2期'))
]

演示: 全外关联
rdd1.fullOuterJoin(rdd2).collect() 
结果:
[
    ('c04', (None, '大数据4期')), 
    ('c01', ('张三', '大数据1期')), 
    ('c01', ('王五', '大数据1期')), 
    ('c01', ('赵六', '大数据1期')), 
    ('c02', ('李四', '大数据2期')), 
    ('c02', ('田七', '大数据2期')),
    ('c03', ('周八', None))
]
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
leftOuterJoinrightOuterJoin 是 Spark 中两种常用的连接操作,它们分别表示左外连接和右外连接。 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)) 这一项。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

留不住的人

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值