2015-07-18 2 views
5

Я пытаюсь определить переменную аккумуляторного типа String, в оболочке Scala (драйвер), но я получаю следующее сообщение об ошибке: -не в состоянии объявить Строка типа аккумулятора

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 типа аккумулятора.

Благодаря

ответ

10

Это потому, что Спарк по умолчанию предоставляет только аккумуляторы типа Long, Double и Float. Если вам нужно что-то еще, вам нужно продлить 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, а в худшем случае сценарий может завершиться неудачно из-за нехватки ресурсов. Аккумуляторы полезны в основном для простых задач диагностики, таких как отслеживание основных статистических данных.

+0

val accum = sc.accumulator (0) (SparkContext.IntAccumulatorParam) для целых аккумуляторов. – Neethu

Смежные вопросы