以下是在嘗試將作業分派給執行程序時導致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'是一個局部變量還是包含類的字段? –