Как получить доступ к аккумуляторам в объекте вне того места, где они были определены?

Я определяю функцию вспомогательной карты как отдельную функцию во вспомогательном объекте, и она не «видит» аккумулятор, определенный ранее в коде. Spark docs рекомендует хранить «удаленные» функции внутри объекта, но как мне заставить все это работать с этими аккумуляторами?

object mainlogic{
    val counter = sc.accumulator(0)
    val data = sc.textFile(...)// load logic here
    val myrdd = data.mapPartitionsWithIndex(mapFunction)
}

object helper{
  def mapFunction(...)={
      counter+=1 // not compiling
  }
}

person Michael Zeltser    schedule 03.06.2015    source источник


Ответы (1)


Что-то подобное нужно было бы передать в качестве параметра, как и любой другой код:

object mainlogic{
    val counter = sc.accumulator(0)
    val data = sc.textFile(...)// load logic here
    val myrdd = data.mapPartitionsWithIndex(mapFunction(counter, _, _))
}

object helper{
  def mapFunction(counter: Accumulator[Int], ...)={
      counter+=1 // not compiling
  }
}

Однако не забудьте запомнить примечание из документации:

Для обновлений аккумулятора, выполняемых только внутри действий, Spark гарантирует, что обновление аккумулятора каждой задачи будет применено только один раз, т. е. перезапущенные задачи не будут обновлять значение. При преобразованиях пользователи должны знать, что обновление каждой задачи может применяться более одного раза, если задачи или этапы задания выполняются повторно.

person Justin Pihony    schedule 03.06.2015