如何将Spark的累加器传递给函数?

时间:2016-08-03 14:00:25

标签: scala apache-spark accumulator bigdata

我想做这样的事情。

val ac = sc.accumulator(0)
....
a = a.map(x => someFunction(x, the_accumulator_object))
....

上面代码中the_accumulator_ojbect的位置应该是什么?写ac会不会很好?

另外,在函数中

def someFunction(x: TypeOfX, a: TypeOfAccumulator) : ReturnType =
{
    .....
}

上述函数中TypeOfAccumulator的位置应该是什么?

1 个答案:

答案 0 :(得分:5)

有关Spark累加器的其他信息,请访问here

根据有关创建累加器的scala-docs:

  

/ ** *创建一个[[org.apache.spark.Accumulator]]变量   给定类型,在Spark UI中具有display *的名称。任务可以   使用+=方法将“添加”值添加到累加器。只有 *   驱动程序可以访问累加器的value。 * /

默认累加器类型为int。您可以设置自己的类型,但需要正确实现+=方法以将值添加到您自己的累加器类型中:

val ac = sc.accumulator[MyOwnType](MyOwnTypeObject, "my own type object accumulator")

您的主要代码片段如下:

val ac = sc.accumulator(0, "some accumulator")
....
a = a.map(x => someFunction(x, ac))
....
System.out.println("My accumulator value is: " + ac.value)

someFunction方法的植入方式如下:

def someFunction(x: TypeOfX, ac: Accumulator[Int]) : ReturnType =
{
    ...
    ac += 1
    ...
}