无法声明字符串类型累加器

时间:2015-07-18 23:21:49

标签: scala apache-spark rdd

我正在尝试在Scala shell(驱动程序)中定义String类型的累加器变量,但我一直收到以下错误: -

scala> val myacc = sc.accumulator("Test")
<console>:21: error: could not find implicit value for parameter param: org.apache.spark.AccumulatorParam[String]
       val myacc = sc.accumulator("Test")
                                 ^

对于Int或Double类型的累加器来说,这似乎没有问题。

由于

1 个答案:

答案 0 :(得分:10)

这是因为Spark默认只提供LongDoubleFloat类型的累加器。如果您还需要其他内容,则必须延长AccumulatorParam

import org.apache.spark.AccumulatorParam

object StringAccumulatorParam extends AccumulatorParam[String] {

    def zero(initialValue: String): String = {
        ""
    }

    def addInPlace(s1: String, s2: String): String = {
        s"$s1 $s2"
    }
}

val stringAccum = sc.accumulator("")(StringAccumulatorParam)

val rdd = sc.parallelize("foo" :: "bar" :: Nil, 2)
rdd.foreach(s => stringAccum += s)
stringAccum.value

注意

通常,您应该避免将累加器用于数据可能随时间显着增长的任务。它的行为类似于groupcollect,在最坏的情况下,由于缺乏资源,情况可能会失败。累加器主要用于简单的诊断任务,如跟踪基本统计数据。