2016-06-16 3 views
0

Im пытается запустить простую карту сократить работу и получил следующие наборы данных:объекта не распознаются при выполнении MapReduce работы

bike.txt

1 Bike 1 
2 Bike 2 
3 Bike 4 
4 Bike 4 
5 Bike 4 

bikenames.txt

1,Aap 
2,Noot 
3,Greet 
4,Mies 
5,Gazelle 

Моя цель - написать задание mapreduce, в котором больше всего указано название велосипеда. Поэтому я написал следующее:

from mrjob.job import MRJob 
from mrjob.step import MRStep 

class MostPopularBike(MRJob): 
def configure_options(self): 
     super(MostPopularBike, self).configure_options() 
     self.add_file_option('--items', help='Path to u.item') 

    def steps(self): 
     return [ 
      MRStep(mapper=self.mapper_get_ratings, 
        reducer=self.reducer_count_ratings), 
      MRStep(mapper = self.mapper_passthrough, 
        reducer = self.reducer_find_max) 
     ] 

    def mapper_get_ratings(self, _, line): 
     (bikeID, name) = line.split('\t') 
     yield bikeID, 1 

    def reducer_init(self): 
     self.bikeNames = {} 

     with open("bikenames.txt`") as f: 
      for line in f: 
       fields = line.split(',') 
       self.bikeNames[fields[0]] = fields[1] 

    def reducer_count_ratings(self, key, values): 
     yield None, (sum(values), self.bikeNames[key]) 

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

    def reducer_find_max(self, key, values): 
     yield max(values) 

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

Если я пытаюсь запустить его с помощью:

!python MostPopularBike.py --items=bikenames.txt bike.txt 

Это trows следующее сообщение об ошибке, однако:

AttributeError: 'MostPopularBike' object has no attribute 'bikeNames' 

Любые мысли о том, что здесь идет не так?

ответ

1

bikeNames определяется только в reducer_init(), поэтому эту функцию нельзя вызывать. Во всяком случае, это не действительно функция инициализации для каждого шага; это больше похоже на инициализацию работы.

Измените имя функции от reducer_init до __init__, чтобы выполнить инициализацию при создании экземпляра MostPopularBike. Или, если вы действительно хотите инициализации выполняется на каждом шаге, обновите ваш steps к этому:

def steps(self): 
    return [ 
     MRStep(reducer_init=self.reducer_init, 
       mapper=self.mapper_get_ratings, 
       reducer=self.reducer_count_ratings), 
     MRStep(reducer_init=self.reducer_init, 
       mapper = self.mapper_passthrough, 
       reducer = self.reducer_find_max) 
    ] 
+0

Это не дает ответа на этот вопрос. Чтобы критиковать или просить разъяснения у автора, оставьте комментарий ниже их сообщения. - [Из обзора] (/ review/low-quality-posts/12712320) – IanS

+0

@IanS, согласовано. Отредактировал мой ответ. – Riaz