Warum wird SparkSession für eine Aktion zweimal ausgeführt?

Neues Upgrade auf Spark 2.0 und merkwürdiges Verhalten beim Erstellen eines einfachen Datasets aus JSON-Zeichenfolgen. Hier ist ein einfacher Testfall:

 SparkSession spark = SparkSession.builder().appName("test").master("local[1]").getOrCreate();
 JavaSparkContext sc = new JavaSparkContext(spark.sparkContext());

 JavaRDD<String> rdd = sc.parallelize(Arrays.asList(
            "{\"name\":\"tom\",\"title\":\"engineer\",\"roles\":[\"designer\",\"developer\"]}",
            "{\"name\":\"jack\",\"title\":\"cto\",\"roles\":[\"designer\",\"manager\"]}"
         ));

 JavaRDD<String> mappedRdd = rdd.map(json -> {
     System.out.println("mapping json: " + json);
     return json;
 });

 Dataset<Row> data = spark.read().json(mappedRdd);
 data.show();

Und die Ausgabe:

mapping json: {"name":"tom","title":"engineer","roles":["designer","developer"]}
mapping json: {"name":"jack","title":"cto","roles":["designer","manager"]}
mapping json: {"name":"tom","title":"engineer","roles":["designer","developer"]}
mapping json: {"name":"jack","title":"cto","roles":["designer","manager"]}
+----+--------------------+--------+
|name|               roles|   title|
+----+--------------------+--------+
| tom|[designer, develo...|engineer|
|jack| [designer, manager]|     cto|
+----+--------------------+--------+

Es scheint, dass die "Map" -Funktion zweimal ausgeführt wird, obwohl ich nur eine Aktion durchführe. Ich dachte, Spark würde träge einen Ausführungsplan erstellen und ihn dann bei Bedarf ausführen, aber dies lässt den Eindruck entstehen, dass der Plan mindestens zweimal ausgeführt werden muss, um Daten als JSON zu lesen und alles damit zu tun.

In diesem einfachen Fall spielt es keine Rolle, aber wenn die Kartenfunktion lange läuft, wird dies zu einem großen Problem. Stimmt das, oder fehlt mir etwas?

Antworten auf die Frage(2)

Ihre Antwort auf die Frage