为什么使用了累加器,仍然提示Task not serializable?

Effpom 2017-06-05 10:13:35
自己写了一个Array[Long]的累加器,使用时提示Task not serializable
以下为出错代码:

after_filter.mapPartitions{
part=>
part.filter(iter=>{
val zz=FilterFunc1(iter.asInstanceOf[InternalRow],accumulatorLong)
val aa=iter.getLong(2).toString
zz
})
}

Array[Long]累加器:

class AccumulatorLong extends AccumulatorV2[Array[Long],Array[Long]] with Serializable{
var LongArray:Array[Long]=new Array[Long](10)
var i:Int=0
def add(value:Array[Long]):Unit={
LongArray(LongArray.length)=value(0)
}

def contains(num:Long):Boolean={
for(i<-0 to 9)
{
if(LongArray(i)==num)
return true
}
false
}
def add(value:Long): Unit ={
LongArray(i)=value
i+=1
}
def delet(num:Long): Unit ={
for(i<-0 to 20)
if(LongArray(i)==num)
LongArray(i)=0
}
/* override add(value:Array[Long]):Unit={

}*/
def getValue(i:Int):Long={
LongArray(i)
}
override def isZero = {
LongArray.isEmpty
}
override def copy() = {
val newLong=new AccumulatorLong()
LongArray.foreach(iter=>newLong.add(iter.toLong))
newLong
}
override def value = {
LongArray
}

override def merge(other: AccumulatorV2[Array[Long], Array[Long]]) =other match {
case map:AccumulatorLong=>{
other.value.foreach(x=>
if(!this.value.contains(x))
this.add(x)
)
}
case _ =>
throw new UnsupportedOperationException(
s"Cannot merge ${this.getClass.getName} with ${other.getClass.getName}"
)
}
def reset(): Unit ={

}

}


望大神指点!
...全文
158 1 打赏 收藏 转发到动态 举报
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
Effpom 2017-06-06
  • 打赏
  • 举报
回复
问题已解决,只要注册相应的累加器以下就可以了。

 val accmulator=new MapAccumulator
    var accmulatortopk=new LongAccumulator
    val accumulatorLong=new MapAccumulator
    this.sparkContext.register(accmulator)
    this.sparkContext.register(accmulatortopk)
    this.sparkContext.register(accumulatorLong)

1,258

社区成员

发帖
与我相关
我的任务
社区描述
Spark由Scala写成,是UC Berkeley AMP lab所开源的类Hadoop MapReduce的通用的并行计算框架,Spark基于MapReduce算法实现的分布式计算。
社区管理员
  • Spark
  • shiter
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧