Ошибка пользовательского спарк-аккумулятора при использовании типа класса Java в смешанном проекте Scala и Java Spark - PullRequest
1 голос
/ 21 мая 2019

все!Я кодирую искровой проект, смешивающий языки Scala и Java.Некоторые классы были написаны на Java, а я занимаюсь Spark в Scala.Мне нужно использовать пользовательский класс аккумулятора (BagAccum расширяет AccumulatorV2 [Int, Bag]) с Int в качестве ввода и Bag в качестве вывода.Тип Bag - это Java-класс в проекте.Компилятор покажет мне ошибку:

BagAccum должен быть абстрактным, поскольку значение метода в классе AccumulatorV2 типа => structure.Bag не определено main.scala / BagGraph / src line 75 Проблема Scala

В этом случае, как я могу определить класс Bag?Ниже приведен полный код класса Scala BagAccum.

Это мой код, объявляющий класс 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 голосов
/ 21 мая 2019

Я пробовал разные решения, но более простым является исключительно кодирование аккумулятора в 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;
        }
    }

}

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...