2017-05-24 296 views
1

我遇到了Java Spark數據集的groupByKey方法的問題。下面的代碼,當在測試環境中本地運行(火花2.1.0,火花core_2.11,火花sql_2.11),引發以下例外:Java Spark數據集自動編譯異常

java.lang.Exception: failed to compile: org.codehaus.commons.compiler.CompileException: File 'generated.java', Line 43, Column 21: No applicable constructor/method found for zero actual parameters; candidates are: "public int org.package.example.ExampleTest$1ExampleClass.getX()

代碼是:

class ExampleClass implements Serializable { 
     private int x; 
     private int y; 
     public ExampleClass() {} 
     public ExampleClass(int x, int y) {this.x = x; this.y = y;} 

     public int getX() {return x;} 

     public void setX(int x) { 
      this.x = x; 
     } 

     public int getY() { 
      return y; 
     } 

     public void setY(int y) { 
      this.y = y; 
     } 

     @Override 
     public boolean equals(Object o) { 
      if (this == o) return true; 
      if (o == null || getClass() != o.getClass()) return false; 

      ExampleClass that = (ExampleClass) o; 

      if (x != that.x) return false; 
      return y == that.y; 
     } 

     @Override 
     public int hashCode() { 
      int result = x; 
      result = 31 * result + y; 
      return result; 
     } 
    } 
    ExampleClass exampleClass1 = new ExampleClass(1, 1); 
    ExampleClass exampleClass2 = new ExampleClass(1, 2); 
    ExampleClass exampleClass3 = new ExampleClass(1, 3); 

    List<ExampleClass> exampleClasses = Lists.newArrayList(
      exampleClass1, 
      exampleClass2, 
      exampleClass3 
    ); 

    Dataset<ExampleClass> dataset = spark.createDataset(exampleClasses, Encoders.bean(ExampleClass.class)); 

    KeyValueGroupedDataset<Integer, ExampleClass> grouped = dataset.groupByKey(
      (MapFunction<ExampleClass, Integer>) ExampleClass::getX, 
      Encoders.INT() 
    ); 
} 

它看起來好像找不到默認的無參數構造函數,或者我將一些東西拋出。另外有趣的是,如果我將整數改爲整數,它表示候選者是getY()而不是getX()。

任何幫助非常感謝!

編輯:經過一番亂搞後,將ExampleClass移出我測試中的嵌套類並進入它自己的文件修復了問題。我仍然不知道爲什麼儘管如此,仍然讚賞任何答案。

回答