在混合Scala和Java Spark项目中使用Java类类型的自定义累加器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问题 在这种情况下,如何定义Bag类?下面是Bagacum scala类的完整代码 这是我的代码,声明Bagacum类在混合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问题 在这种情况下,如何定
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;
}
}