Python3 MRJob выводит несортированные пары ключ-значение - PullRequest
0 голосов
/ 09 мая 2018

Контекст

Python 3.6.3 :: Anaconda custom (64-bit)
mrjob == 0.6.2 без пользовательской конфигурации
работает локально

Я реализую базовый пример подсчета слов для задания сокращения локальной карты. Мой картограф отображает 1 для каждого слова в каждой строке книги из файла .txt, используя простое регулярное выражение. Редуктор подсчитывает количество вхождений каждого слова, то есть количество единиц, сгруппированных по каждому слову.

from mrjob.job import MRJob
import re

WORD_REGEXP = re.compile(r"[\w']+")

class WordCounter(MRJob):
  def mapper(self, _, line):
    words = WORD_REGEXP.findall(line)
    for word in words:
      yield word.lower(), 1

  def reducer(self, word, times_seen):
    yield word, sum(times_seen)

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

Задача

Выходной файл правильный, но пары ключей и значений не сортируются глобально. Похоже, что результат отсортирован только по алфавиту в виде кусочков данных.

"customers'"    1
"customizing"   1
"cut"   2
"cycle" 1
"cycles"    1
"d" 10
"dad"   1
"dada"  1
"daily" 3
"damage"    1
"deductible"    6
...
"exchange"  10
"excited"   4
"excitement"    1
"exciting"  4
"executive" 2
"executives"    2
"theft" 1
"their" 122
"them"  166
"theme" 2
"themselves"    16
"then"  59
"there" 144
"they've"   2
...
"anecdotes" 1
"angel" 1
"angie's"   1
"angry" 1
"announce"  2
"announced" 1
"announcement"  3
"announcements" 3
"announcing"    2
...
"patents"   3
"path"  19
"paths" 1
"patterns"  1
"pay"   45
"exercise"  1
"exercises" 1
"exist" 6
"expansion" 1
"expect"    11
"expectation"   3
"expectations"  5
"expected"  4
....
"customer"  41
"customers" 122
"yours" 15
"yourself"  78
"youth" 1
"zealand"   1
"zero"  7
"zoho"  1
"zone"  2

Вопрос

Есть ли какая-то начальная конфигурация, чтобы получить глобально отсортированный вывод от MRJob?

1 Ответ

0 голосов
/ 10 мая 2018

Вы пропустили шаг объединителя, в этом руководстве это первый пример одношагового задания: https://mrjob.readthedocs.io/en/latest/guides/writing-mrjobs.html

Я напишу код для полноты ответа:

from mrjob.job import MRJob
import re

WORD_RE = re.compile(r"[\w']+")


class MRWordFreqCount(MRJob):

    def mapper(self, _, line):
        for word in WORD_RE.findall(line):
            yield word.lower(), 1

    def combiner(self, word, counts):
        yield word, sum(counts)

    def reducer(self, word, counts):
        yield word, sum(counts)


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