Есть ли способ создать глобальный набор в одном задании MapReduce и получить к нему доступ в последующих заданиях? - PullRequest
0 голосов
/ 19 сентября 2019

Я пытаюсь выучить MapReduce.В качестве проблемы с игрушкой у меня есть набор данных линий, каждая из которых выглядит следующим образом: "name, favourite_team, friend1, friend2, ..., friend_n".Например:

Aaden, Red Sox, Alannah, Alayna, Alex, Aaliyah
Aaliyah, Cardinals, Adley, Aliyah, Aaden

Я хочу использовать MapReduce, чтобы найти для каждого человека количество друзей-фанатов «Кардиналов», которое у них есть.

Для этого я могу использовать MapReduce, чтобы сделатьнабор поклонников кардинала.Теперь я хотел бы распространить этот набор на каждую машину, а затем сопоставить исходные данные, в тандеме с этим набором, с количеством фан-друзей кардинала, которые есть у каждого человека.

Как я могу это сделатьэто?Это правильное использование парадигмы?Вот пример решения, которое они дали: здесь , но оно отличается от моего предполагаемого подхода.

В Hadoop и MapReduce есть нечто, называемое DistributedCache.Может быть, это было бы полезно?

Для справки:

Вот как я создал набор поклонников кардиналов:

from mrjob.job import MRJob

#prelim: just get a set of cardinal fans and non-cardinal fans
class MRCardinal(MRJob):
    def mapper(self, key, line):
        s = line.split(", ")
        name = s[0]
        team = s[1]
        friends = s[2:]
        if team == 'Cardinals':
            yield 'c', name
        else:
            yield 'n', name
    def reducer(self, key, values):
        if key == 'c':
            yield key, [v for v in values] #don't return a generator.
        if key == 'n':
            yield key, [v for v in values]
    # now we have a list of values, and a set

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