2013-09-28 5 views
0

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

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, и эта переменная не может быть разделена. Есть ли другой способ сделать это?

+0

В моем опыте, такого рода проблемы возникают из не правильно преобразовать вашу проблему в парадигме MR. Не могли бы вы предоставить более подробную информацию о алгоритме, который вы реализуете? Мой подход состоял бы в том, чтобы испустить счетчик * и забрать его в редукторе. Помните, что вы работаете в распределенной вычислительной среде - никаких гарантий, где находятся данные. – pcoving

ответ

1

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

class MRWord(MRJob): 
    count = [] 

и падение

def mapper_init_def(self): 
    self.count = {} 

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

  • Нет связанных вопросов^_^