我有一个Mapper,它经历了大量的数据并将ID号作为键发送,其值为1.我希望MapReduce作业能够获得所有已找到的ID的列表跨所有数据的时间,这是重复ID的列表。例如:
映射器发出:
abc 1
efg 1
cba 1
abc 1
dhh 1
在这种情况下,您可以看到ID' abc'已经被Mapper发出了不止一次。
如何编辑此Reducer以便它只发出重复项?即值大于1的键:
import sys
import codecs
sys.stdout = codecs.getwriter('utf-8')(sys.stdout)
inData = codecs.getreader('utf-8')(sys.stdin)
(last_key, tot_cnt) = (None, 0)
for line in inData:
(key, val) = line.strip().split("\t")
if last_key and last_key != key:
sys.stdout.write("%s\t%s\n" % (last_key,tot_cnt))
(last_key, tot_cnt) = (key, int(val))
else:
(last_key, tot_cnt) = (key, tot_cnt + int(val))
if last_key:
sys.stdout.write("%s\t%s\n" % (last_key, tot_cnt))
答案 0 :(得分:0)
你在很少的地方犯了错误。
此代码:
settings.LOGGING
应更改为:
if last_key and last_key != key:
sys.stdout.write("%s\t%s\n" % (last_key,tot_cnt))
您没有检查if last_key != key:
if(tot_cnt > 1):
sys.stdout.write("%s\t%s\n" % (last_key, tot_cnt))
。
最后两行:
tot_cnt > 1
应更改为:
if last_key:
sys.stdout.write("%s\t%s\n" % (last_key, tot_cnt))
再次,您没有检查if last_key and tot_cnt > 1:
sys.stdout.write("%s\t%s\n" % (last_key, tot_cnt))
。
以下是修改后的代码,对我有用:
tot_cnt > 1
我得到以下输出,用于您的数据:
import sys
import codecs
sys.stdout = codecs.getwriter('utf-8')(sys.stdout)
inData = codecs.getreader('utf-8')(sys.stdin)
(last_key, tot_cnt) = (None, 0)
for line in inData:
(key, val) = line.strip().split("\t")
if last_key != key:
if(tot_cnt > 1):
sys.stdout.write("%s\t%s\n" % (last_key, tot_cnt))
(last_key, tot_cnt) = (key, int(val))
else:
(last_key, tot_cnt) = (key, tot_cnt + int(val))
if last_key and tot_cnt > 1:
sys.stdout.write("%s\t%s\n" % (last_key, tot_cnt))