die Existenz einer RDD von Tupeln ähnlich dem folgenden Unter der Annahme:Spark RDD: Wie Statistiken am effizientesten zu berechnen?
(key1, 1)
(key3, 9)
(key2, 3)
(key1, 4)
(key1, 5)
(key3, 2)
(key2, 7)
...
Was ist der effizienteste (und idealerweise verteilt) Art und Weise Statistiken zu den einzelnen Tasten zu berechnen? (Im Moment suche ich nach Standardabweichung/Varianz zu berechnen, insbesondere.) Wie ich es verstehe, meine Optionen betragen:
- Verwenden Sie den
colStats
function in MLLib: Dieser Ansatz den Vorteil, leicht adaptierbare hat Andere Funktionen später zu verwenden, wenn andere statistische Berechnungen für notwendig erachtet werden. Es arbeitet jedoch mit einer RDD vonVector
, die die Daten für jede Spalte enthält, so wie ich es verstehe, würde dieser Ansatz erfordern, dass der vollständige Satz von Werten für jeden Schlüssel auf einem einzelnen Knoten gesammelt wird, was für große nicht ideal erscheinen würde Datensätze. Bedeutet ein SparkVector
immer, dass die Daten in derVector
lokal resident sind, auf einem einzigen Knoten? - Führen Sie eine , dann
stats
: Wahrscheinlich shuffle-schwer, as a result of thegroupByKey
operation. aggregateByKey
Führen Sie einen neuenStatCounter
Initialisierung und mitStatCounter::merge
wie die Sequenz und Kombinierer Funktionen: Dies ist der Ansatz recommended by this StackOverflow answer und vermeidet diegroupByKey
von Option 2. Allerdings habe ich eine gute Dokumentation nicht in der Lage gewesen zu findenStatCounter
in PySpark.
Ich mag Option 1, da sie den Code erweiterbar, in das macht es leicht kompliziertere Berechnungen mit anderen MLLib Funktionen mit ähnlichen Verträge aufnehmen konnte, aber wenn die Vector
Eingaben erfordern von Natur aus, dass die Datensätze lokal gesammelt werden, dann begrenzt es die Datengrößen, auf denen der Code effektiv arbeiten kann. Zwischen den beiden anderen, Option 3 sieht effizienter aus, weil es die groupByKey
vermeidet, aber ich hatte gehofft zu bestätigen, dass das der Fall ist.
Gibt es noch andere Optionen, die ich nicht berücksichtigt habe? (Ich verwende derzeit Python + PySpark, aber ich bin offen für Lösungen in Java/Scala auch, wenn es einen Unterschied in der Sprache gibt.)
Mögliches Duplikat von [min/max mit pyspark im Einzeldurchlauf über Daten finden] (http://stackoverflow.com/questions/36559809/finding-min-max-with-pypspark-in-single-pass-over -Daten) –