Spark Java Map函数被执行了两次



我有上面的代码作为Spark驱动程序,当我执行我的程序时,它可以正常工作,将所需的数据保存为Parquet文件。

String indexFile = "index.txt";
JavaRDD<String> indexData = sc.textFile(indexFile).cache();
JavaRDD<String> jsonStringRDD = indexData.map(new Function<String, String>() {
  @Override
  public String call(String patientId) throws Exception {
   return "json array as string"
  }   
}); 
//1. Read json string array into a Dataframe (execution 1)
DataFrame dataSchemaDF = sqlContext.read().json(jsonStringRDD );
//2. Save dataframe as parquet file (execution 2)
dataSchemaDF.write().parquet("md.parquet");

但是我观察到RDD indexData上的映射器函数被执行了两次。首先,当我用SQLContextjsonStringRdd读成DataFrame时第二,当我将dataSchemaDF写入parquet文件

你能指导我这个,如何避免重复执行吗?是否有其他更好的方式将JSON字符串转换为数据框架?

我认为原因是缺少JSON阅读器的模式。当你执行:

sqlContext.read().json(jsonStringRDD);

Spark必须为新创建的DataFrame推断模式。要做到这一点,它有扫描输入RDD,这一步急切地执行

如果你想避免它,你必须创建一个StructType来描述JSON文档的形状:

StructType schema;
...

并在创建DataFrame:

时使用它
DataFrame dataSchemaDF = sqlContext.read().schema(schema).json(jsonStringRDD);

相关内容

  • 没有找到相关文章

最新更新