如何使用mrjob mapper reducer在Python中编写迭代,计数器是循环中计算的一部分?

时间:2013-09-28 15:30:34

标签: python mapper mrjob reducers

我有一个程序可以连续迭代mapper和reducer 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()

我定义了一个两步式mapper reducer,这样第一个定义了一个类变量self.count。该程序产生错误AttributeError: 'MRWord' object has no attribute 'count'。似乎每个步骤都定义了一个独立的mrjob类对象,并且该变量无法共享。还有另一种方法来实现这一目标吗?

1 个答案:

答案 0 :(得分:1)

为什么不尝试在课堂上定义你的计数?

class MRWord(MRJob):
    count = []

并删除

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