web-dev-qa-db-fra.com

Quelle est la différence entre rejoindre et cogroupe dans Apache Spark

Quelle est la différence entre rejoindre et cogroup dans Apache Spark? Quel est le cas d'utilisation de chaque méthode?

32
miaoiao

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

51
ashburshui