我从.edges文件(Facebook社交节点)获取数据。这些文件中的每一行代表图形中的一条边。例如,

123 95

表示从节点123到节点95有一条边。对于每个节点X,我对从偶数个节点进入的边的数目感兴趣。但是我只对节点X至少有3个从偶数节点进入的边缘感兴趣。

我的问题是我为循环尝试了不同的尝试,并且在求和(值列表)仅大于或等于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
这是我现在在结果中得到的输出。
"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

注意第二列中的一些-> sum(valuelist)->小于3。这不是我想要的预期输出。

最佳答案

您需要在 reducer 中过滤出结果

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

关于python - 在此MapReduce问题中,如何选择有选择的值之和大于3?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/58002761/

10-12 05:43