在这个mapreduce问题中,如何有选择地选择值之和大于3?

gzszwxb4  于 2021-05-29  发布在  Hadoop
关注(0)|答案(1)|浏览(353)

我正在从.edges文件(facebook社交节点)获取数据。这些文件中的每一行表示图形中的一条边。例如,
123 95
意味着从节点123到节点95有一条边。对于每个节点x,我感兴趣的是来自偶数节点的传入边的数量。但我只对节点x感兴趣,它至少有3条来自偶数节点的传入边。
我的问题是,我已经尝试了不同的for循环,并且正在努力在结果中导出sum(valuelist)值,其中sum(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,所以它不会进入输出。在输出文件中,键应该是节点号,值应该是来自偶数节点的传入边数。
这是我现在在结果中得到的结果。

"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。。这不是我想要的预期输出。

z9ju0rcb

z9ju0rcb1#

你需要过滤掉减速机中的结果

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

相关问题