Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/388.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/apache-spark/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 为什么SparkSession对一个操作执行两次?_Java_Apache Spark_Apache Spark Sql - Fatal编程技术网

Java 为什么SparkSession对一个操作执行两次?

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

最近升级到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();
似乎“map”函数被执行了两次,尽管我只执行了一个操作。我原以为Spark会懒洋洋地构建一个执行计划,然后在需要时执行它,但这似乎意味着为了将数据读取为JSON并对其执行任何操作,该计划必须至少执行两次


在这个简单的例子中,这并不重要,但是当map函数长时间运行时,这就成了一个大问题。这是对的,还是我遗漏了什么?

这是因为您没有为
DataFrameReader
提供架构。因此,Spark必须急切地扫描数据集以推断输出模式

由于未缓存
mappedRdd
,因此将对其进行两次计算:

  • 一次用于模式推理
  • 在调用
    data.show时显示一次
如果要阻止,应为reader提供模式(Scala语法):

val schema: org.apache.spark.sql.types.StructType = ???
spark.read.schema(schema).json(mappedRdd)