Если вам действительно нужно RDD
с, то вы могли бы получить свой результат, используя subtract
и union
.
Если предположить, что вас интересуют различия с обеих сторон, это сработает:
val left = sc.makeRDD(Seq(("m1","p1"), ("m1","p2"), ("m1","p3"), ("m2","p1"), ("m2","p2"), ("m2","p3"), ("m2","p4")))
val right = sc.makeRDD(Seq(("m1","p1"), ("m1","p2"), ("m1","p3"), ("m2","p1"), ("m2","p2"), ("m2","p3"), ("m3","p1")))
val output = left.subtract(right).union(right.subtract(left))
output.collect() // Array[(String, String)] = Array((m2,p4), (m3,p1))
С другой стороны, если вы не против сохранить «полное внешнее соединение» в памяти, вы можете добиться того же, используя cogroup
:
val output = left.cogroup(right).flatMap { case (k, (i1, i2)) =>
val s1 = i1.toSet
val s2 = i2.toSet
val diff = (s1 diff s2) ++ (s2 diff s1)
diff.toList.map(k -> _)
}
output.collect() // Array[(String, String)] = Array((m2,p4), (m3,p1))