Как напечатать вхождение слова? - PullRequest
0 голосов
/ 05 марта 2020

У меня проблема с использованием функции Mapreduce

Теперь я знаю, как найти рабочую ситуацию

from mrjob.job import MRJob

class MRWordCounter(MRJob):

 def mapper(self, key, line):

   for word in line.split():
   yield word, 1

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

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

, но что если вопрос похож на то, что мне нужно напечатать, в какой строке слово происходит, предположим, у меня есть следующий файл, имеющий следующие данные

 line 1- goat,chicken,horse
 line 2- cat,horse
 line 3- dog,cat,sheep
 line 4- buffalo,dolphin,cat
 line 5- sheep 

, поэтому вывод должен быть таким:

"buffalo" ["buffalo,dolphin,cat"]
"cat" ["buffalo,dolphin,cat", "cat,horse", "dog,cat,sheep"]
"chicken" ["goat,chicken,horse"]
"dog" ["dog,cat,sheep"]
"dolphin" ["buffalo,dolphin,cat"]
"goat" ["goat,chicken,horse"]
"horse" ["cat,horse", "goat,chicken,horse"]
"sheep" ["dog,cat,sheep", "sheep"]

1 Ответ

0 голосов
/ 06 марта 2020

В mapper

yield word, line

В reducer

yield word, occurrences

и он создаст word [line, otherline]


from mrjob.job import MRJob

class MRWordCounter(MRJob):

    def mapper(self, key, line):
        line = line.strip()
        for word in line.split(","):
            yield word, line

    def reducer(self, word, occurrences):
        yield word, occurrences

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

РЕДАКТИРОВАТЬ: Эта версия использует второй step с новым reducer для сортировки результатов

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

class MRLineGrouperAndSorter(MRJob):

    def steps(self):
        return [
            MRStep(
                mapper=self.mapper,
                reducer=self.reducer
            ),
            MRStep(
                reducer=self.reducer_sort
            )
        ]

    def mapper(self, key, line):
        line = line.strip()   # remove some spaces in line
        words = line.split(",")
        #line = ",".join(sorted(words)) # sorting words in lines
        for word in words:
            yield word, line

#    def combiner(self, word, values):
#        for line in values:
#            yield word, line

    def reducer(self, word, values):
        yield None, (word, values)  # use `None` (or other value) for all items and next reducer will get all items in one list

    def reducer_sort(self, key, values):  # key is None, values is [(word, values), (word, values), ...]
        for word, line in sorted(values):
            yield word, line

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