Как я могу написать итерацию на Python с помощью редуктора mrjob mapper, для которого счетчик является частью вычисления в цикле?

У меня есть программа, которая итерирует маппер и редьюсер n раз подряд. Однако для каждой итерации сопоставитель каждой пары ключ-значение вычисляет значение, зависящее от n.

from mrjob.job import mrjob

class MRWord(mrjob):

  def mapper_init_def(self):

        self.count = {}


    def mapper_count(self, key, value):

            self.count[key] = 0

            print self.count[key]
      # print correctly  
            yield key, value


  def mapper_iterate(self, key, value):
      yield key, value
      print self.count[key]
  #error

  def reducer_iterate(self, key, value):
      yield key, value


  def steps(self):
      return [
        self.mr(mapper_init=self.mapper_init_def, mapper=self.mapper_count),

        self.mr(mapper=self.mapper_iterate, reducer=self.reducer_iterate)
      ]


if __name__ == '__main__':
    MRWord.run()

Я определил двухэтапный редюсер преобразователя, так что первый определяет переменную класса self.count. Программа выдает ошибку AttributeError: 'MRWord' object has no attribute 'count'. Кажется, что каждый шаг определяет независимый объект класса mrjob, и эта переменная не может использоваться совместно. Есть ли другой способ сделать это?


person Pippi    schedule 28.09.2013    source источник
comment
По моему опыту, такого рода проблемы возникают из-за неправильного преобразования вашей проблемы в парадигму MR. Не могли бы вы предоставить более подробную информацию об алгоритме, который вы реализуете? Мой подход состоял бы в том, чтобы выпустить счетчик сам по себе и собрать его в редьюсере. Помните, что вы работаете в распределенной вычислительной среде — нет никаких гарантий, где находятся данные.   -  person pcoving    schedule 03.10.2013


Ответы (1)


Почему бы вам не попробовать определить свой счет в классе?

class MRWord(MRJob):
    count = []

и брось

def mapper_init_def(self):
   self.count = {}
person kgu87    schedule 02.10.2013