大家!我正在编写一个混合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()
}
答案 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;
}
}
}