Java Spark数据集自动编译异常

时间:2017-05-24 14:08:14

标签: java apache-spark

我遇到了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从我的测试中的嵌套类中移出并放入其自己的文件中可以解决问题。我仍然不知道为什么,所以任何答案仍然受到赞赏。

1 个答案:

答案 0 :(得分:2)

我有同样的问题。在我的情况下,我怀疑你的问题是,你的类没有使用public修饰符声明。

public class ExampleClass implements Serializable

感谢Andy Grove:AbstractEventLoop.call_at