[英]Class nullPoint exception in Spark
我的課是這樣的。 我也得到結果“為空”。 如果刪除testClass上的瞬態標簽,即使認為TestClass已經實現了Serializable,也會導致任務無法序列化的錯誤。 那么,為什么mergeLog中的對象testClass為null?
public class MergeLog implements Serializable {
private static final Logger LOGGER = LoggerFactory.getLogger(LogFormat.class);
private transient SparkConf conf = new SparkConf().setAppName("log join");
private transient JavaSparkContext sc = new JavaSparkContext(conf);
private HiveContext hiveContext = new org.apache.spark.sql.hive.HiveContext(sc.sc());
private transient TestClass testClass = new TestClass();
public void process() {
JavaRDD<String> people = sc.textFile("/user/people.txt");
String schemaString = "name age";
List<StructField> fields = new ArrayList<StructField>();
for (String fieldName: schemaString.split(" ")) {
fields.add(DataTypes.createStructField(fieldName, DataTypes.StringType, true));
}
StructType schema = DataTypes.createStructType(fields);
JavaRDD<Row> rowRDD = people.map(
new Function<String, Row>() {
@Override
public Row call(String record) throws Exception {
String[] fields = record.split(",");
return RowFactory.create(fields[0], fields[1].trim());
}
});
DataFrame peopleDataFrame = sqlContext.createDataFrame(rowRDD, schema);
JavaRDD<String> javaRDD = peopleDataFrame.toJavaRDD().map(
new Function<Row, String>() {
@Override
public String call(Row row) throws Exception {
String ins = null;
if (testClass == null) {
return "is null";
} else {
ins = testClass.calc(row);
}
}
});
}
public static void main(String[] args) {
MergeLog mergeLog = new MergeLog();
mergeLog.process();
}
}
class TestClass implements Serializable {
public String calc(Row row) {
return row.mkString();
}
}
測試類在驅動程序端創建,並且由於它是瞬態的,因此不會將實例傳遞給工作程序。 在內部創建一個新的測試實例
peopleDataFrame.toJavaRDD().map(
new Function<Row, String>() {
@Override
public String call(Row row) throws Exception {
String ins = null;
ins = new TestClass().calc(row);
}
}
});
此外,行類不可序列化,因此,當您從TestClass中刪除瞬態時,它表示不可序列化異常。 僅將所需的參數從Row傳遞到類以進行處理。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.