Quelle est la différence entre rejoindre et cogroup dans Apache Spark? Quel est le cas d'utilisation de chaque méthode?
Laissez-moi vous aider à les clarifier, les deux sont communs et importants !
def join[W](other: RDD[(K, W)]): RDD[(K, (V, W))]
Ceci est prototype
of join, regardez-le attentivement. Par exemple,
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)))
Toutes les clés qui apparaîtront dans le résultat final est commun à rdd1 et rdd2. Ceci est similaire à relation database operation INNER JOIN
.
Mais le cogroupe est différent,
def cogroup[W](other: RDD[(K, W)]): RDD[(K, (Iterable[V], Iterable[W]))]
lorsqu'une clé apparaît au moins dans l'un des deux disques, elle apparaîtra dans le résultat final, laissez-moi le préciser:
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)))
)
C'est très similar
à relation database operation FULL OUTER JOIN
, mais au lieu d’aplatir le résultat par ligne et par enregistrement, vous obtiendrez le interable interface
à vous, l'opération suivante est à vous de choisir!
Bonne chance!
Les documents Spark sont: http://spark.Apache.org/docs/latest/api/scala/index.html#org.Apache.spark.rdd.PairRDDFunctions