2016-06-23 2 views
0

클래스는 다음과 같습니다. 나는 또한 "null이다"라는 결과를 얻는다. testClass에서 일시적인 태그를 제거하면 TestClass가 Serializable을 구현한다고 생각하더라도 직렬화 할 수없는 작업 오류가 발생합니다. 그렇다면 mergeLog에있는 object testClass가 null 인 이유는 무엇입니까?Spark의 클래스 nullPoint 예외

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(); 
    } 
} 

답변

1

테스트 클래스는 드라이버 끝에서 만들어지며 일시적이므로 인스턴스가 작업자에게 전달되지 않습니다.

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에서 필수 매개 변수 만 클래스로 전달하여 처리합니다.