映射器输出在组合器中加倍

时间:2012-11-20 21:04:04

标签: java hadoop mapreduce combiners

映射器仅输出一次值。但是当我检查合并器的值是两次。这对我来说真的很奇怪。

请帮助。

发送输出的地图代码模块:

for(int i = 0; i<alcmapi.size(); i++)
{
    int section = 0;

    for(int j = 0; j<alcmapj.size(); j++)
    {
        if(!alcmapi.get(i).getid().equals(alcmapj.get(j).getid()))
        {
            int fi = Integer.parseInt(alcmapi.get(i).getField());
            int fj = Integer.parseInt(alcmapj.get(j).getField());

            ArrayList<CustomMap> al = new ArrayList<CustomMap>();
            al.add(new CustomMap(alcmapi.get(i).getid(), fi));
            al.add(new CustomMap(alcmapj.get(j).getid(), fj));


            if(fi<fj)
            {
                section = fi;
            }
            else
            {
                section = fj;
            }
            Collections.sort(al);
            {
                output.collect(new Text(t+" "+al.get(0).getid()), new Text(al.get(1).getid()+"  "+section));         

            }
        }
    }
}

在合并器中:

我看到当我在这里检查时,与键对应的值会加倍:

while(values.hasNext()){
    String val = values.next().toString();
    System.out.println("val:"+val);
}

提前致谢!

1 个答案:

答案 0 :(得分:1)

看起来您要针对所有其他元素测试所有元素。例如,如果元素3和5符合条件,那么你将为i = 3,j = 5再写一次,对于i = 5,j = 3再次写出。

我建议你将内循环改为:

for(int j = i+1; j<alcmapj.size(); j++)