我从.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/