Объявите 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
Другие вопросы по тегам