Какая разница между join и cogroup в Apache Spark

Какая разница между join и cogroup в Apache Spark? И когда их использовать

Ответы

Ответ 1

Позвольте мне помочь вам прояснить их, оба являются общими для использования и важны!

def join[W](other: RDD[(K, W)]): RDD[(K, (V, W))]

Это prototype соединения, , пожалуйста, внимательно посмотрите на него. Например,

val rdd1 = sc.makeRDD(Array(("A","1"),("B","2"),("C","3")),2)
val rdd2 = sc.makeRDD(Array(("A","a"),("C","c"),("D","d")),2)

scala> rdd1.join(rdd2).collect
res0: Array[(String, (String, String))] = Array((A,(1,a)), (C,(3,c)))

Все ключи, которые появятся в конечном результате , являются общими для rdd1 и rdd2. Это похоже на relation database operation INNER JOIN.

Но cogroup отличается,

def cogroup[W](other: RDD[(K, W)]): RDD[(K, (Iterable[V], Iterable[W]))]

поскольку один ключ, по крайней мере, появится в любом из двух rdds, он появится в конечном результате, позвольте мне пояснить это:

val rdd1 = sc.makeRDD(Array(("A","1"),("B","2"),("C","3")),2)
val rdd2 = sc.makeRDD(Array(("A","a"),("C","c"),("D","d")),2)

scala> var rdd3 = rdd1.cogroup(rdd2).collect
res0: Array[(String, (Iterable[String], Iterable[String]))] = Array(
(B,(CompactBuffer(2),CompactBuffer())), 
(D,(CompactBuffer(),CompactBuffer(d))), 
(A,(CompactBuffer(1),CompactBuffer(a))), 
(C,(CompactBuffer(3),CompactBuffer(c)))
)

Это очень сильно отличается от similar до relation database operation FULL OUTER JOIN, но вместо того, чтобы сгладить результат по каждой строке на запись, он предоставит вам interable interface, следующая операция до вас как удобно!

Удачи!

Искры docs: http://spark.apache.org/docs/latest/api/scala/index.html#org.apache.spark.rdd.PairRDDFunctions