In der Dokumentation von Spark heißt es, dass die RDDs-Methode reduce
eine assoziative UND-kommutative Binärfunktion benötigt.Spark: Unterschied der Semantik zwischen reduce und reduceByKey
Die Methode reduceByKey
erfordert jedoch nur eine assoziative Binärfunktion.
sc.textFile("file4kB", 4)
Ich habe einige Tests gemacht, und anscheinend ist es das Verhalten, das ich bekomme. Warum dieser Unterschied? Warum stellt reduceByKey
sicher, dass die Binärfunktion immer in einer bestimmten Reihenfolge angewendet wird (um die fehlende Kommutativität auszugleichen), wenn reduce
nicht funktioniert?
Beispiel, wenn eine Last einige (kleine) Text mit 4 Partitionen (Minimum):
val r = sc.textFile("file4k", 4)
dann:
r.reduce(_ + _)
einen String zurückgibt, wo Teile, die nicht immer in der gleichen Reihenfolge sind, während:
r.map(x => (1,x)).reduceByKey(_ + _).first
gibt immer die gleiche Zeichenfolge (wo alles in der gleichen Reihenfolge als in der ursprünglichen ist l Datei).
(Ich überprüft mit r.glom
und der Dateiinhalt ist in der Tat verteilt über 4 Partitionen, es gibt keine leere Partition).
ich die Idee mit 'reduceByKey' Vermutung ist, dass Sie wahrscheinlich viele verschiedene Schlüssel, so dass es in Ordnung ist, alles für einen einzelnen Schlüssel in einem einzelnen Thread zu reduzieren, was bedeutet, dass Sie die Berechnung immer von links nach rechts ausführen können. Im Gegensatz dazu wird "reduce" oft für einen großen Datensatz verwendet, so dass die Reihenfolge der Operationen nicht wichtig ist. –
Wie viele Executoren verwenden Sie in Ihren Experimenten? – gprivitera