Объявите mrjob mapper без игнорирования ключа
Я хочу объявить функцию сопоставления с mrjob. Поскольку моя функция отображения должна ссылаться на некоторые константы для выполнения некоторых вычислений, поэтому я решил поместить эти константы в ключ в преобразователе (есть ли другой способ?). Я читаю учебник по mrjob на этом сайте, но все примеры игнорируют ключ. Например:
class MRWordFrequencyCount(MRJob):
def mapper(self, _, line):
yield "chars", len(line)
yield "words", len(line.split())
yield "lines", 1
def reducer(self, key, values):
yield key, sum(values)
В принципе, я хотел бы что-то вроде:
def mapper(self, (constant1,constant2,constant3,constant4,constant5), line):
My calculation goes here
Пожалуйста, предложите мне, как это сделать. Спасибо
1 ответ
Решение
Вы можете установить свои константы в своем __init__
from mrjob.job import MRJob
class MRWordFrequencyCount(MRJob):
def mapper(self, key, line):
yield "chars", len(line)
yield "words", len(line.split())
yield "lines", 1
yield "Constant",self.constant
def reducer(self, key, values):
yield key, sum(values)
def __init__(self,*args,**kwargs):
super(MRWordFrequencyCount, self).__init__(*args, **kwargs)
self.constant = 10
if __name__ == '__main__':
MRWordFrequencyCount.run()
Выход:
"Constant" 10
"chars" 12
"lines" 1
"words" 2
Или вы можете использовать RawProtocol
from mrjob.job import MRJob
import mrjob
class MRWordFrequencyCount(MRJob):
INPUT_PROTOCOL = mrjob.protocol.RawProtocol
def mapper(self, key, line):
yield "constant", key
yield "chars", len(line)
yield "words", len(line.split())
yield "lines", 1
def reducer(self, key, values):
if str(key) != "constant":
yield key, sum(values)
else:
yield "constant",list(values)
if __name__ == '__main__':
MRWordFrequencyCount.run()
если ввод:
constant1,constant2,constant3 The quick brown fox jumps over the lazy dog
выход:
"chars" 43
"constant" ["constant1,constant2,constant3"]
"lines" 1
"words" 9