Java 为什么SparkSession对一个操作执行两次?
最近升级到Spark 2.0,在尝试从JSON字符串创建简单数据集时,我看到了一些奇怪的行为。下面是一个简单的测试用例:Java 为什么SparkSession对一个操作执行两次?,java,apache-spark,apache-spark-sql,Java,Apache Spark,Apache Spark Sql,最近升级到Spark 2.0,在尝试从JSON字符串创建简单数据集时,我看到了一些奇怪的行为。下面是一个简单的测试用例: SparkSession spark = SparkSession.builder().appName("test").master("local[1]").getOrCreate(); JavaSparkContext sc = new JavaSparkContext(spark.sparkContext()); JavaRDD<String> rdd
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();
似乎“map”函数被执行了两次,尽管我只执行了一个操作。我原以为Spark会懒洋洋地构建一个执行计划,然后在需要时执行它,但这似乎意味着为了将数据读取为JSON并对其执行任何操作,该计划必须至少执行两次
在这个简单的例子中,这并不重要,但是当map函数长时间运行时,这就成了一个大问题。这是对的,还是我遗漏了什么?这是因为您没有为
DataFrameReader
提供架构。因此,Spark必须急切地扫描数据集以推断输出模式
由于未缓存mappedRdd
,因此将对其进行两次计算:
- 一次用于模式推理
- 在调用
data.show时显示一次
val schema: org.apache.spark.sql.types.StructType = ???
spark.read.schema(schema).json(mappedRdd)