У меня есть программа, которая выполняет итератор и редуктор 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, и эта переменная не может быть разделена. Есть ли другой способ сделать это?
В моем опыте, такого рода проблемы возникают из не правильно преобразовать вашу проблему в парадигме MR. Не могли бы вы предоставить более подробную информацию о алгоритме, который вы реализуете? Мой подход состоял бы в том, чтобы испустить счетчик * и забрать его в редукторе. Помните, что вы работаете в распределенной вычислительной среде - никаких гарантий, где находятся данные. – pcoving