自定义聚合器中的Spark Accumulator

时间:2018-02-27 18:34:13

标签: apache-spark accumulator aggregator

我有一个自定义聚合器,在reduce方法中,我想使用累加器来做一些统计。

我应该如何将累加器传递给聚合器?

我是否必须将累加器作为构造函数参数传递,还是必须使用AccumulatorContext.get(0)

1 个答案:

答案 0 :(得分:0)

在聚合器外部创建累加器(在执行器节点上运行的任何其他代码之外)并在聚合器中使用它。变量本身可以像任何其他正常变量一样传递。

val ds = sc.parallelize(1 to 5).toDS()
val acc = sc.longAccumulator
val mySumAgg = new Aggregator[Int, Int, Int] {
  def reduce(b: Int, a: Int): Int = {
    acc.add(1)
    a + b
  }      
  [...]
}.toColumn

ds.groupByKey( i => i)
  .agg(mySumAgg)
  .show()

print("Merge has been called " + acc.value + " times")

如果您为聚合器创建了一个单独的类,则可以通过构造函数传递累加器,也可以使用setter。

您不应该使用AccumulatorContext,因为文档说:

  

用于跟踪Spark本身的累加器的内部类。