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被执行两次。首先,当我读jsonStringRddDataFrame使用SQLContext

第二时,当我将其写入 dataSchemaDF实木复合地板文件时

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

回答:

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

sqlContext.read().json(jsonStringRDD);

Spark必须为新创建的推断架构DataFrame。为此,它具有扫描输入RDD,并且急切地执行此步骤

如果要避免这种情况,则必须创建一个StructType描述JSON文档形状的:

StructType schema;

...

并在创建时使用它DataFrame

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

以上是 Spark Java Map函数被执行两次 的全部内容, 来源链接: utcz.com/qa/407397.html

回到顶部