Spark RDD: Wie berechnet man Statistiken am effizientesten?

ngenommen, es gibt eine RDD mit Tupeln, die der folgenden ähnel

(key1, 1)
(key3, 9)
(key2, 3)
(key1, 4)
(key1, 5)
(key3, 2)
(key2, 7)
...

Was ist die effizienteste (und im Idealfall verteilte) Methode zur Berechnung von Statistiken, die den einzelnen Schlüsseln entsprechen? (Im Moment möchte ich insbesondere die Standardabweichung / -varianz berechnen.) Nach meinem Verständnis betragen meine Optionen:

Verwende dascolStats Funktion in MLLib: Dieser Ansatz hat den Vorteil, leicht anpassbar zu sein, um anderemllib.stat funktioniert später, wenn andere statistische Berechnungen als notwendig erachtet werden. Es wird jedoch mit einer RDD von @ betriebeVector enthält die Daten für jede Spalte, so wie ich es verstehe, würde dieser Ansatz erfordern, dass der gesamte Wertesatz für jeden Schlüssel auf einem einzelnen Knoten gesammelt wird, was für große Datensätze nicht ideal erscheint. Macht ein FunkeVector bedeutet immer, dass die Daten imVector lokal auf einem einzelnen Knoten residieren?Perform agroupByKey, dannstats: Wahrscheinlich shufflelastig,als Ergebnis desgroupByKey Betrie.AusführenaggregateByKey, Initialisierung eines neuenStatCounter und mitStatCounter::merge als Sequenz- und Kombinationsfunktion: Das ist der Ansatz von dieser StackOverflow-Antwort empfohlen und vermeidet dasgroupByKey von Option 2. Es ist mir jedoch nicht gelungen, eine gute Dokumentation für @ zu findeStatCounter in PySpark.

Ich mag Option 1, weil dadurch der Code erweiterbarer wird, da es leicht möglich ist, kompliziertere Berechnungen mit anderen MLLib-Funktionen mit ähnlichen Verträgen durchzuführen. Wenn jedochVector -Eingaben erfordern von Natur aus, dass die Datensätze lokal erfasst werden, und begrenzen dann die Datengrößen, mit denen der Code effektiv arbeiten kann. Zwischen den beiden anderen, Option 3sieht au effizienter, weil es die @ vermeidgroupByKey, aber ich hatte gehofft zu bestätigen, dass dies der Fall ist.

Gibt es noch andere Optionen, die ich nicht in Betracht gezogen habe? (Ich verwende derzeit Python + PySpark, bin aber auch offen für Lösungen in Java / Scala, wenn es einen Sprachunterschied gibt.)

Antworten auf die Frage(2)

Ihre Antwort auf die Frage