在混合Scala和Java Spark项目中使用Java类类型的自定义累加器Spark错误

在混合Scala和Java Spark项目中使用Java类类型的自定义累加器Spark错误,java,scala,apache-spark,Java,Scala,Apache Spark,大家好!我正在编写一个混合scala和java语言的spark项目。有些类是用Java编写的,而我用Scala处理Spark。我需要使用自定义累加器类(BagAccum扩展了累加器v2[Int,Bag]),Int作为输入,Bag作为输出。Bag类型是项目中的一个java类。编译器向我显示错误: BagAccum需要是抽象的,因为类型=>structure.Bag的类AccumeratorV2中的方法值未定义main.scala/BagGraph/src第75行scala问题 在这种情况下,如何定

大家好!我正在编写一个混合scala和java语言的spark项目。有些类是用Java编写的,而我用Scala处理Spark。我需要使用自定义累加器类(BagAccum扩展了累加器v2[Int,Bag]),Int作为输入,Bag作为输出。Bag类型是项目中的一个java类。编译器向我显示错误:

BagAccum需要是抽象的,因为类型=>structure.Bag的类AccumeratorV2中的方法值未定义main.scala/BagGraph/src第75行scala问题

在这种情况下,如何定义Bag类?下面是Bagacum scala类的完整代码

这是我的代码,声明Bagacum类

class BagAccum extends AccumulatorV2[Int, Bag] { 
    private var bag:Bag = new Bag
    override def isZero: Boolean = bag.empty()
    override def copy(): BagAccum = {
      val newBag = new BagAccum
      newBag.bag = this.bag
      newBag
    }
    override def reset(): Unit = bag = null
    override def add(v: Int): Unit ={
        bag.insert(v)
    }
    override def merge(other: AccumulatorV2[Int, Bag]): Unit = bag.merge(other.value)
    def size():Int = bag.size()
}

我尝试了不同的解决方案,但更简单的是仅用Java编写累加器,如下所示:

{

公共类累加器扩展累加器v2
{
私有静态最终长serialVersionUID=-3739727823287550826L;
私人行李_值=新行李();
公营机构({
}
公用行李收集器(行李arg0){
_值=arg0;
}
@凌驾
公共空添加(整数arg0){
_插入(arg0);
}
@凌驾
公共累加器v2副本(){
返回新的行李收集器(_值);
}
@凌驾
公共布尔值为零(){
返回_value.empty();
}
@凌驾
公共无效合并(累加器V2 arg0){
_value.merge(arg0.value());
}
@凌驾
公共无效重置(){
_value.clear();
}
@凌驾
公共行李价值(){
返回_值;
}
}

}

我尝试了不同的解决方案,但更简单的是仅用Java编写累加器,如下所示:

{

公共类累加器扩展累加器v2
{
私有静态最终长serialVersionUID=-3739727823287550826L;
私人行李_值=新行李();
公营机构({
}
公用行李收集器(行李arg0){
_值=arg0;
}
@凌驾
公共空添加(整数arg0){
_插入(arg0);
}
@凌驾
公共累加器v2副本(){
返回新的行李收集器(_值);
}
@凌驾
公共布尔值为零(){
返回_value.empty();
}
@凌驾
公共无效合并(累加器V2 arg0){
_value.merge(arg0.value());
}
@凌驾
公共无效重置(){
_value.clear();
}
@凌驾
公共行李价值(){
返回_值;
}
}

}

您应该添加一些代码,以显示triedI作为答案发布。堆栈向我显示了错误。我在下面作为答案发布。谢谢@FernandodeSá您现在可以删除您的答案:)您应该添加一些代码以显示triedI发布为答案。堆栈向我显示了错误。我在下面作为答案发布。谢谢@费尔南多德斯:你现在可以删除你的答案:)
public  class BagAccumulator extends AccumulatorV2<Integer,Bag>
    {
        private static final long serialVersionUID = -3739727823287550826L;

        private Bag _value = new Bag();

        public BagAccumulator() {
        }

        public BagAccumulator(Bag arg0) {
            _value = arg0;
        }

        @Override
        public void add(Integer arg0) {
            _value.insert(arg0);
        }

        @Override
        public AccumulatorV2<Integer, Bag> copy() {
            return new BagAccumulator(_value);
        }

        @Override
        public boolean isZero() {
            return _value.empty();
        }

        @Override
        public void merge(AccumulatorV2<Integer, Bag> arg0) {
            _value.merge(arg0.value());
        }

        @Override
        public void reset() {
            _value.clear();
        }

        @Override
        public Bag value() {
            return _value;
        }
    }