Я пытаюсь выучить 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()