Почему SparkSession выполняется дважды за одно действие?

Недавно обновлен до Spark 2.0, и я вижу странное поведение при попытке создать простой набор данных из строк JSON. Вот простой тестовый пример:

 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();

И вывод:

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|
+----+--------------------+--------+

Кажется, что функция «карта» выполняется дважды, хотя я выполняю только одно действие. Я думал, что Spark лениво построит план выполнения, а затем выполнит его при необходимости, но это создает впечатление, что для чтения данных в формате JSON и выполнения каких-либо действий с ним план должен быть выполнен как минимум дважды.

В этом простом случае это не имеет значения, но когда функция map работает долго, это становится большой проблемой. Это правильно, или я что-то упустил?

Ответы на вопрос(1)

Ваш ответ на вопрос