我遇到了Java Spark Dataset的groupByKey方法的问题。以下代码在测试环境(Spark 2.1.0,spark-core_2.11,spark-sql_2.11)中本地运行时会引发以下异常:
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
从我的测试中的嵌套类中移出并放入其自己的文件中可以解决问题。我仍然不知道为什么,所以任何答案仍然受到赞赏。
答案 0 :(得分:2)
我有同样的问题。在我的情况下,我怀疑你的问题是,你的类没有使用public
修饰符声明。
public class ExampleClass implements Serializable
感谢Andy Grove:AbstractEventLoop.call_at