我有一个Mapper,它正在处理大量数据,并将ID号作为值为1的键发出。我希望使用MapReduce作业实现的是获得在所有数据中多次找到的所有ID的列表,这是一个重复ID的列表。例如:
映射器发射:
abc 1
efg 1
cba 1
abc 1
dhh 1
在这种情况下,您可以看到ID"abc"已由映射器发出不止一次。
如何编辑此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("%st%sn" % (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("%st%sn" % (last_key, tot_cnt))
您在一些地方犯了错误。
-
此代码:
if last_key and last_key != key: sys.stdout.write("%st%sn" % (last_key,tot_cnt))
应更改为:
if last_key != key: if(tot_cnt > 1): sys.stdout.write("%st%sn" % (last_key, tot_cnt))
您没有检查
tot_cnt > 1
。 -
最后2行:
if last_key: sys.stdout.write("%st%sn" % (last_key, tot_cnt))
应更改为:
if last_key and tot_cnt > 1: sys.stdout.write("%st%sn" % (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("%st%sn" % (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("%st%sn" % (last_key, tot_cnt))
对于您的数据,我得到以下输出:
abc 2