以下是在尝试将作业分派给执行程序时导致java.io.NotSerializableException的代码。在映射JavaRDD时获取java.io.NotSerializableException
JavaRDD<Row> rddToWrite = dataToWrite.toJavaRDD();
JavaRDD<String> stringRdd = rddToWrite.map(new Function<Row, String>() {
/**
* Serial Version Id
*/
private static final long serialVersionUID = 6766320395808127072L;
@Override
public String call(Row row) throws Exception {
return row.mkString(dataFormat.getDelimiter());
}
});
然而,当我这样做,任务成功连载:
JavaRDD<Row> rddToWrite = dataToWrite.toJavaRDD();
List<String> dataList = rddToWrite.collect().stream().parallel()
.map(row -> row.mkString(dataFormat.getDelimiter()))
.collect(Collectors.<String>toList());
JavaSparkContext javaSparkContext = new JavaSparkContext(sessionContext.getSparkContext());
JavaRDD<String> stringRDD = javaSparkContext.parallelize(dataList);
任何人都可以请帮我指出我在做什么错在这里?
编辑: dataFormat是包含此代码的函数写入的类中的私有成员字段。它是DataFormat类的一个对象,它定义了两个字段,即spark数据格式(例如“com.databricks.spark.csv”)和分隔符(例如“\ t”)。
什么'dataFormat'? –
'dataFormat'是一个局部变量还是包含类的字段? –