Spark RDD的关联操作
join 关联
Spark默认的join是inner join操作,即两边都有的键
初始化
val a1=sc.parallelize(Array(("K1","V1"),("K2","V2"),("K3","V3")))
val a2=sc.parallelize(Array(("K1","V2"),("K3","B3"),("K4","V4")))
join
a1.join(a2).foreach(println)
输出
(K1,(V1,V2))
(K3,(V3,B3))
可以看出join操作时inner join,只会将两个RDD都有的键进行关联
leftOuterJoin
顾名思义,a1.leftOuterJoin
是左外连接,以左边的键为基准,关联右边的集合元素,没有则关联元素为None
a1.leftOuterJoin(a2).foreach(println)
输出
(K1,(V1,Some(V2)))
(K2,(V2,None))
(K3,(V3,Some(B3)))
因为左边有K1,K2,K3这三个键,所以会有三行输出,其中K2在集合a2没有,所以显示了None
rightOuterJoin
右外连接,以右侧为基准,关联左侧集合
a1.rightOuterJoin(a2).foreach(println)
输出
(K4,(None,V4))
(K1,(Some(V1),V2))
(K3,(Some(V3),B3))
fullOuterJoin
全连接就是两个集合的left join和right join的合并了
a1.fullOuterJoin(a2).foreach(println)
输出
(K1,(Some(V1),Some(V2)))
(K3,(Some(V3),Some(B3)))
(K4,(None,Some(V4)))
(K2,(Some(V2),None))
subtract 补集
补集就是不在当前集合而在另一个集合的元素子集
初始化
val a3=sc.parallelize(Array(1,4,5,6,9))
val a4=sc.parallelize(Array(1,2,4,5,8))
a3.subtract(a4).foreach(println)
输出
9
6
因为a3中6,9不在a4中,所以输出6,9
cartesian 卡迪尔积
卡迪尔积就是一个集合的每一个元素和另一个集合每个元素进行组合
a3.cartesian(a4).foreach(println)
输出
(1,1)
(1,2)
(4,1)
(4,2)
(1,4)
(1,5)
(1,8)
(4,4)
(4,5)
(4,8)
(5,4)
(5,5)
(5,8)
(6,4)
(6,5)
(6,8)
(9,4)
(9,5)
(9,8)
(5,1)
(5,2)
(6,1)
(6,2)
(9,1)
(9,2)
和full join有点类似,但是又不是,自己体会,另外普通的数组没法做join,必须要有key,通关key关联
附录
关于集合的关联示意图