2016-03-30 4 views
4

Ich habe eine Textdatei sherlock.txt mit mehreren Zeilen Text. Ich lade es in Spark-Shell mit:Effizienz von flatMap vs Karte gefolgt von reduzieren in Spark

val textFile = sc.textFile("sherlock.txt") 

Mein Zweck ist es, die Anzahl der Wörter in der Datei zu zählen. Ich bin auf zwei alternative Wege gestoßen, um den Job zu machen.

Zuerst mit flatMap:

textFile.flatMap(line => line.split(" ")).count() 

Zweite mit Karte, gefolgt von verringern:

textFile.map(line => line.split(" ").size).reduce((a, b) => a + b) 

Beide richtig das gleiche Ergebnis liefern. Ich möchte die Unterschiede in der zeitlichen und räumlichen Komplexität der obigen beiden alternativen Implementierungen kennen, wenn es überhaupt welche gibt?

Konvertiert der Scala-Interpreter beide in die effizienteste Form?

Antwort

5

Ich werde argumentieren, dass die meisten idiomatische Weg, dies zu map und sum wäre zu handhaben:

textFile.map(_.split(" ").size).sum 

aber das Ende des Tages ein Gesamtkosten von line.split(" ") wird dominiert.

Sie könnten wahrscheinlich ein bisschen besser tun, indem Sie manuell über die Zeichenfolge iterieren und aufeinanderfolgende Leerzeichen zählen, anstatt neue Array zu erstellen, aber ich bezweifle, dass es den ganzen Aufwand im Allgemeinen wert ist.

Wenn Sie lieber ein wenig tiefer Einblick count is defined as:

def count(): Long = sc.runJob(this, Utils.getIteratorSize _).sum 

wo Utils.getIteratorSize ziemlich viel eine naive Iteration über Iterator mit einer Summe von Einsen und sum is equivalent to

_.fold(0.0)(_ + _)