2015-12-04 3 views
3

Я занимаюсь Apache Spark, но столкнулся со следующей проблемой.Аккумулятор Искры меня смущает.

val accum = sc.accumulator(0, "My Accumulator.") 
println (accum) // print out: 0 

sc.parallelize(Array(1, 2, 3, 4, 5)).foreach(x => accum += x) 
// sc.parallelize(Array(1, 2, 3, 4, 5)).foreach(x => accum = accum + x) 
println(accum.value) // print out: 15 

Эта строка кода sc.parallelize(Array(1, 2, 3, 4, 5)).foreach(x => accum += x) работает достаточно хорошо, но код закомментирована ниже него не работает. Разница заключается в том:

x => accum += x 

и

x => accum = accum + x 

Почему второй один не работает?

ответ

4

Есть три причины, почему он не работает:

  1. accum является величиной, поэтому он не может быть переназначен
  2. Accumulable класс, который является базовым классом для Accumulator обеспечивает только += метод, а не +
  3. аккумуляторы записываются только с рабочего места, поэтому вы не можете прочитать значение внутри действия. Теоретически метод + мог модифицировать accum на месте, но это было бы довольно запутанным.
4

Потому что это верить или нет, в Apache Spark работает как глобальная переменная только для записи в Accumulator, в нашем императивном думать, что мы не видим никакой разницы между x += 1 и x = x + 1, но есть небольшая разница, то второй операция в Apache Spark потребовала бы считывания значения, но первая не была бы, или проще (как нуль сказал в его пояснении), метод + не реализован для этого класса. Apache Spark на с. 41, вы можете прочитать о том, как это работает, слайды извлекаются из Introduction to Big Data with Apache Spark

+0

Спасибо за слайды, они великолепны. –