2015-02-24 5 views
8

Bezug zu Spark - Joining 2 PairRDD elementsIn spark Join, tut Tabelle Reihenfolge wie in Schwein?

Wenn ein regelmäßigen in den Schweinen verbinden tun, die letzte Tabelle in der Verknüpfung nicht in dem Speicher gebracht, sondern durch stattdessen gestreamt, so dass, wenn eine kleine Mächtigkeit pro Taste und B große Mächtigkeit hat, ist es wesentlich besser ist zu tun join A, B als join A by B, aus performance perspektive (Vermeidung von Verschütten und OOM)

Gibt es ein ähnliches Konzept in Funken? Ich habe keine solche Empfehlung gesehen und frage mich, wie ist das möglich? Die Implementierung sieht mir ziemlich ähnlich wie in Schwein: https://github.com/apache/spark/blob/master/core/src/main/scala/org/apache/spark/rdd/CoGroupedRDD.scala

Oder fehlt mir etwas?

Antwort

3

Es macht keinen Unterschied, in Funken wird die RDD nur in den Speicher gebracht, wenn es zwischengespeichert wird. In Funke, um den gleichen Effekt zu erzielen, können Sie die kleinere RDD zwischenspeichern. Eine andere Sache, die Sie in Funken tun können, die ich nicht sicher bin, dass Schwein tut, ist, wenn alle RDDs zusammengefügt werden, die den gleichen Trenner haben, muss kein Shuffle getan werden.

+0

ok, aber nehmen wir an, dass wir keine RDD zwischenspeichern. Ich nehme an, dass Spark eine Art Nested-Loops zwischen den 2 RDDs macht. Wenn A 1M Datensätze pro Join-Schlüssel hat und B nur 3 Datensätze pro Join-Schlüssel, aber beide sind riesig. Wenn die äußere (linke) Tabelle A ist, wird jeder Join-Schlüssel zu Überlauf auf die Festplatte führen ... richtig? – ihadanny

+0

@ihadanny, wenn Sie sich die [Quelle] (https://github.com/apache/spark/blob/master/core/src/main/scala/org/apache/spark/rdd/PairRDDFunctions.scala#L503) ansehen Alles ist ein Iterator, also wird nichts notwendigerweise in den Speicher geladen. Wenn ein Iterator erschöpft ist, würde er einfach von Anfang an beginnen, da er so aussieht, als würde die for-Schleife die Ausgabe im Speicher belassen – aaronman