Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/362.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/hadoop/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何使减速器仅发射重复项_Python_Hadoop_Mapreduce_Reduce - Fatal编程技术网

Python 如何使减速器仅发射重复项

Python 如何使减速器仅发射重复项,python,hadoop,mapreduce,reduce,Python,Hadoop,Mapreduce,Reduce,我有一个映射器,它正在处理大量数据,并将ID号作为值为1的键发出。我希望通过MapReduce作业可以获得一个列表,其中包含在所有数据中多次找到的所有ID,这是一个重复ID的列表。例如: 映射器发射: abc 1 efg 1 cba 1 abc 1 dhh 1 在本例中,您可以看到ID“abc”已由映射器发出多次 如何编辑此减速机,使其仅发射重复项?i、 e.值大于1的键: import sys import codecs sys.stdout = codecs.getwriter('utf

我有一个映射器,它正在处理大量数据,并将ID号作为值为1的键发出。我希望通过MapReduce作业可以获得一个列表,其中包含在所有数据中多次找到的所有ID,这是一个重复ID的列表。例如:

映射器发射:
abc 1
efg 1
cba 1
abc 1
dhh 1

在本例中,您可以看到ID“abc”已由映射器发出多次

如何编辑此减速机,使其仅发射重复项?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))

你在几个地方犯了错误

  • 此代码:

    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))
    
    if last_key and tot_cnt > 1:
        sys.stdout.write("%s\t%s\n" % (last_key, tot_cnt))
    
    您没有检查
    tot\u cnt>1

  • 最后两行:

    if last_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))
    
    if last_key and tot_cnt > 1:
        sys.stdout.write("%s\t%s\n" % (last_key, tot_cnt))
    
    这里再次说明,您没有检查
    tot\u 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
    

    你在每次迭代中都要扔掉val,你需要做一个dict来累积值。好的!你能告诉我代码示例/它将放置在减速器中的什么位置吗?