两个RDD元素的联合

时间:2015-12-15 14:39:08

标签: scala apache-spark union rdd

我想在scala中做两个RDD的联合。我不能将它们中的任何一个存储在内存中,因为它们非常大。

A = {k1->List(A,B,C), k2->List(W,E,Q)}
B = {k1->List(D,E,F), k2->List(E,U,O)}

如何进行A和B联合以获得

{(A,B,C,D,E,F),(W,E,Q,U,O)}

谢谢, 南西

2 个答案:

答案 0 :(得分:1)

注意:此答案与问题的第4版匹配。从那以后,问题发生了变化。我没有删除答案,因为有一些关于使用zip

的陷阱的评论

您可以使用zip

val rdd1 = sc.parallelize(Seq("A", "B", "C"))
val rdd2 = sc.parallelize(Seq("D", "E", "F"))

val zipped = rdd1.zip(rdd2)

导致

scala>zipped.collect().foreach(println)
(A,D)
(B,E)
(C,F)

答案 1 :(得分:1)

据我所知,只需要一个join

val a = sc.parallelize(Seq(
  ("k1" -> List("A", "B" , "C")), ("k2" -> List("W", "E", "Q"))))
val b = sc.parallelize(Seq(
  ("k1" -> List("D", "E", "F")), ("k2" -> List("E", "U", "O"))))

val combined = a.join(b) // Join by key
  .values  // drop keys
  .map{case (x, y) =>  x ++ y} // Combine elements