2016-03-29 17 views
0

Wenn eine bestimmte RDD in Funken zum Beispiel erstellt:Funken RDD Persistenz und Partitionen

lines = sc.textFile("README.md") 

Und dann wird eine Transformation auf dieser RDD genannt:

pythonLines = lines.filter(lambda line: "Python" in line) 

Wenn Sie eine Aktion auf diesem Aufruf transformierte Filter RDD (wie pythonlines.first) was bedeutet es, wenn sie an RDD will be recomputed ones again each time you run an action on them sagen? Ich dachte, dass die ursprüngliche RDD, die Sie mit der textFile-Methode erstellt haben, nicht beibehalten wird, nachdem Sie die filter-Umwandlung auf dieser ursprünglichen RDD aufgerufen haben. Also wird es nur die neueste transformierte RDD neu berechnen, wobei es in diesem Fall die RDD ist, die ich mit der Filtertransformation gemacht habe? Ich sehe nicht wirklich, warum das nötig wäre, wenn meine Annahme richtig ist.

Antwort

2

Im Funke werden RDDs träge ausgewertet. Dies bedeutet, wenn Sie einfach schreiben

Ihr Programm wird beendet, ohne die Datei zu lesen, da Sie das Ergebnis nie verwendet haben. Wenn Sie schreiben, so etwas wie:

linesLength = sc.textFile("README.md").map(line => line.split(" ").length) 
sumLinesLength = linesLength.reduce(_ + _) // <-- scala way 
maxLineLength = linesLength.max() 

Die benötigten Berechnungen lineLength haben zweimal gemacht werden, da Sie es an zwei verschiedenen Stellen wiederverwenden. Um zu vermeiden, dass, sollten Sie Ihre resultierende RDD bestehen, bevor es auf zwei verschiedene Arten

linesLength = sc.textFile("README.md").map(line => line.split(" ").length) 
linesLength.persist() 
// ... 

Sie können auch einen Blick auf https://spark.apache.org/docs/latest/programming-guide.html#rdd-persistence verwenden. Hoffe meine Erklärung ist nicht zu verwirrt!

+0

Oh, also in Ihrem zweiten Beispiel, wenn Sie diese drei Zeilen haben, nachdem Sie die letzte Zeile aufgerufen haben: 'maxLineLength = ZeilenLänge.max()' die 'ZeilenLänge' RDD wird weg sein, da Sie fertig sind. Also, wenn Sie die ZeilenLength RDD an mehreren Stellen in Ihrem Programm verwenden möchten, sollten Sie es beibehalten, so dass Sie Zugriff darauf haben, selbst nachdem Sie fertig sind mit der 'linesLength RDD'. Richtig? – LP496

+1

Grundsätzlich, wenn Sie ein Zwischenergebnis (wie lineLength in meinem Beispiel) haben, die Sie mehrmals wiederverwenden, sollten Sie persistieren(), andernfalls wird es auch von funken mehrmals berechnet. Eine RDD ist keine Daten, es ist "eine Liste von Berechnungen". Wenn Sie also 'lineLength.max()' schreiben, wird Spark * nicht das Maximum von dem verstehen, was Sie vorher berechnet haben, sondern das Maximum des RDD, das ich durch Lesen dieser Datei und Ausführen der Karte erhalten kann. » – christophetd

+0

Ok Jetzt sehe ich, was es bedeutet, die RDD wird überstunden neu berechnen. Danke für die Klarstellung! – LP496

Verwandte Themen