【发布时间】:2016-11-28 06:58:56
【问题描述】:
以下是当我尝试将作业分派给执行程序时导致 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是局部变量还是封闭类的字段?
标签: java serialization apache-spark