Spark Java Map函数正在执行两次

时间:2016-10-16 17:36:00

标签: java apache-spark apache-spark-sql rdd

我将上面的代码作为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上的mapper函数正在执行两次。 首先,当我使用jsonStringRddDataFrame视为SQLContext时 第二,当我将dataSchemaDF写入镶木地板文件时

你能指导我,如何避免这种重复执行?还有其他更好的方法将JSON字符串转换为数据帧吗?

1 个答案:

答案 0 :(得分:6)

我认为原因是缺少JSON阅读器的架构。执行时:

sqlContext.read().json(jsonStringRDD);

Spark必须推断新创建的DataFrame的架构。要做到这一点,它有扫描输入RDD,这一步骤是急切执行

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

StructType schema;
...

并在创建DataFrame时使用它:

DataFrame dataSchemaDF = sqlContext.read().schema(schema).json(jsonStringRDD);