如何让reducer只发出重复的

lmyy7pcs  于 2021-06-02  发布在  Hadoop
关注(0)|答案(1)|浏览(285)

我有一个Map器,它将遍历大量数据,并将id号作为值为1的键发出。我希望通过mapreduce作业可以获得一个列表,其中包含在所有数据中多次找到的所有id,这是一个重复id的列表。例如:
Map器发射:
1
efg 1号机组
cba 1级
1
dhh 1号
在这种情况下,您可以看到id“”已被Map器发出多次。
如何编辑这个减速机,使它只发射重复的?i、 e.值大于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))
gupuwyp2

gupuwyp21#

你在一些地方犯了错误。
此代码:

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 .
最后2行:

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))

对于您的数据,我得到以下输出:

abc     2

相关问题