Angenommen, ich lese ganze Dateien:Wie man eine Liste von Listen mit Spark parallelisiert?
JavaPairRDD<String, String> filesRDD = sc.wholeTextFiles(inputDataPath);
Dann habe ich die folgenden Mapper, die s:
JavaRDD<List<String>> processingFiles = filesRDD.map(fileNameContent -> {
List<String> results = new ArrayList<String>();
for (some loop) {
if (condition) {
results.add(someString);
}
}
. . .
return results;
});
Aus Gründen der Argumentation an, dass im Inneren des Mapper muss ich eine Liste machen von Strings, die ich von jeder Datei zurücksende. Jetzt kann jeder String in jeder Liste unabhängig betrachtet werden und muss später unabhängig verarbeitet werden. Ich möchte nicht, dass Spark jede Liste auf einmal verarbeitet, sondern jede Zeichenfolge auf einmal. Später, wenn ich collect()
benutze, bekomme ich eine Liste von Listen.
Eine Möglichkeit, dies zu tun ist: Wie diese Liste von Listen für jeden String individuell nicht für jede einzelne Liste zu parallelisieren?
Ich bin mir nicht sicher, wie ist das viel anders als das, was ich tue. Kannst du genauer sein? – Belphegor
Map ist eine 1: 1-Funktion, bei der 1 Eingabezeile -> 1 Ausgabezeile ist. Flatmap ist eine 1: N-Funktion, bei der 1 Eingabezeile -> viele (oder 0) Ausgabezeilen sind. Wenn Sie flatMap verwenden, können Sie es so entwerfen, dass Ihre RDD-Ausgabe und RDD von Strings ist, während Ihre RDD-Ausgabe derzeit eine RDD von Listen von Strings ist. Es klingt wie das, was du willst. Ich bin kein Java-Spark-Benutzer, daher kann ich Ihnen keine Syntaxspezifikationen geben. Hier finden Sie Hilfe http://spark.apache.org/examples.html – David
das ist genau das, was ich will! Vielen Dank, bitte setzen Sie diesen Kommentar in Ihre Antwort, damit es klarer ist, falls jemand anders es braucht. Prost! – Belphegor