Как я могу выборочно выбрать сумму значений больше 3 в этой задаче MapReduce? - PullRequest
0 голосов
/ 19 сентября 2019

Я получаю данные из файлов .edges (социальные сети Facebook).Каждая строка в этих файлах представляет ребро на графике.Например,

123 95

означает, что существует ребро от узла 123 до узла 95. Для каждого узла X меня интересует количество входящих ребер от четных узлов.Но меня интересуют только узлы X, которые имеют по крайней мере 3 входящих ребра от четных узлов.

Моя проблема в том, что я пробовал разные циклы и пытаюсь получить значения sum (valuelist) в моих результатах, где сумма (valuelist) только больше или равна 3.

from mrjob.job import MRJob


class WordCount(MRJob):
   def mapper(self, key, line):
      def even_number(key):
         if float(key) %2 == 0:
            return True
         else:
            return False
      split_word = line.split()
      if even_number(split_word[0]):
         yield(split_word[1], 1)

   def reducer(self, key, valuelist):
      yield key, sum(valuelist)

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

Если входное значение равно:

22  7
32  7
33  7
34  7
7   6
2   6
8   6

, то выходное значение будет

7       3

, поскольку узел 7 имеет 3 входящих ребра из четных узлов.Узел 6 имеет только 2 таких входящих ребра и, так как 2 <3, он не попадает в выход.В выходных файлах ключ должен быть номером узла, а значение должно быть числом входящих ребер, которые он имеет от четных узлов. </p>

Это вывод, который я сейчас получаю в своих результатах.

"979"   4
"98"    21
"980"   53
"981"   24
"982"   36
"983"   29
"984"   21
"985"   4
"986"   4
"987"   2
"988"   16
"989"   14
"99"    3
"990"   22
"991"   7
"992"   13
"993"   65
"994"   10
"995"   27
"996"   0
"997"   43
"998"   4
"999"   35

Обратите внимание, что часть 2-го столбца -> sum (valuelist) -> меньше 3 ... это не то, что я хочу в качестве ожидаемого результата.

1 Ответ

0 голосов
/ 19 сентября 2019

Вам нужно отфильтровать результаты в редукторе

def reducer(self, key, valuelist):
    count = sum(valuelist)
    if count >= 3:
        yield key, count 
...