在混合Scala和Java Spark项目中使用Java类类型自定义Accumulator Spark错误

时间:2019-05-21 08:44:51

标签: java scala apache-spark

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

BagAccum必须是抽象的,因为类型=>结构的AccumulatorV2类中的方法值。Bag未定义main.scala / BagGraph / src第75行Scala问题

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

这是我的代码,声明了BagAccum类。

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

1 个答案:

答案 0 :(得分:0)

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

{

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

}