簡體   English   中英

Spark中的類nullPoint異常

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM