如何让Reducer只发出重复项

时间:2015-12-11 22:16:58

标签: python hadoop mapreduce reduce

我有一个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))

1 个答案:

答案 0 :(得分:0)

你在很少的地方犯了错误。

  1. 此代码:

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

  2. 最后两行:

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

  3. 以下是修改后的代码,对我有用:

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