Angenommen, ich habe ein Verteilungssystem auf 3 Knoten und meine Daten werden unter diesen Knoten verteilt. zum Beispiel habe ich eine test.csv-Datei, die auf alle drei Knoten vorhanden ist, und es enthält zwei Spalten:Wie aggregiert Spark Funktion aggregateByKey?
**row | id, c.**
---------------
row1 | k1 , c1
row2 | k1 , c2
row3 | k1 , c3
row4 | k2 , c4
row5 | k2 , c5
row6 | k2 , c6
row7 | k3 , c7
row8 | k3 , c8
row9 | k3 , c9
row10 | k4 , c10
row11 | k4 , c11
row12 | k4 , c12
Dann benutze ich SparkContext.textFile die Datei aus als rdd und so zu lesen. Soweit ich weiß, liest jeder Funke-Arbeiter-Knoten den a-Teil aus der Datei. So jetzt lassen Sie uns jeder Knoten sagen speichert:
- Knoten 1: Reihe 1 ~ 4
- Knoten 2: Zeile 5 ~ 8
- Knoten 3: Zeile 9 ~ 12
Meine Frage ist, dass wir sagen, dass ich eine Berechnung für diese Daten machen möchte, und es gibt einen Schritt, den ich brauche, um den Schlüssel zusammen zu gruppieren, so dass das Schlüsselwertpaar [k1 [{k1 c1} {k1 c2} {k1 c3}]]..
und so weiter wäre.
Es gibt eine Funktion namens groupByKey()
, die sehr teuer zu verwenden ist, und es wird empfohlen, aggregateByKey()
zu verwenden. Also frage ich mich, wie funktioniert groupByKey()
und aggregateByKey()
unter der Haube funktioniert? Kann jemand das oben angegebene Beispiel verwenden, um es zu erklären? Nach dem Mischen, wo befinden sich die Zeilen auf jedem Knoten?
ok, zu meinem Beispiel so können zurückgehen, wenn node1 ~ row3 hat Knoten2 row4 ~ row6 Row1 hat, und node3 zu row12 hat row7. und wenn ich groupByKey mache, werden sich Daten umherbewegen oder nichts bewegt, da sich rdd mit demselben Schlüssel bereits auf dem gleichen Knoten befindet? danke – EdwinGuo
@EdwinGuo nein die Daten könnten immer noch herum bewegen, nehmen wir an, Sie verwenden einen Hash-Partitionierer, wenn alle k1 ist auf Knoten 1, aber k1's Hash-Partitionierer Ergebnis ist 3, es wird immer noch auf den dritten Knoten gehen – aaronman
Aber wenn ich egal, um die Reihenfolge, ich möchte nur ein Array mit allen Werten zurückgeben, wie groupByKey tut. Ist es mit anderer Syntax als groupbykey möglich? –