Почему 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 работает долго, это становится большой проблемой. Это правильно, или я что-то упустил?