对mapwriteable进行迭代和求和,产生荒谬的结果

eiee3dmh  于 2021-05-27  发布在  Hadoop
关注(0)|答案(0)|浏览(248)

这是Map器的输出
让{测试=1,游戏=1,让=2,我=2,你=1}
让{测试=2,让=1,我=2,你=2}
测试{玩=1,让=3,我=2,你=1}
测试{test=1,let=2,me=2,you=2}
你{测试=1,玩=1,让=3,我=2}
你{测试=2,让=2,我=2,你=1}

public static class TokenizerMapper extends Mapper<Object, Text, Text, MapWritable>
public static class IntSumReducer extends Reducer<Text, MapWritable,Text, MapWritable> {

        MapWritable incrementingMap = new MapWritable();

        //reduce method
        public void reduce(Text key, Iterable<MapWritable> values, Context context) throws IOException, InterruptedException
        {

我在操作我的iterable值时感到非常困惑
我要接收具有相同键的所有值的总和。例如,在我的情况下
{测试=1,游戏=1,让=2,我=2,你=1}
{测试=2,让=1,我=2,你=2}
总和=14。
我使用下面的方法来获得键中元素的累积和

private void addall(MapWritable mapWritable)
        {
            Set<Writable> keys = mapWritable.keySet();

            for(Writable key: keys)
            {
                IntWritable val = (IntWritable)mapWritable.get(key);
                if(incrementingMap.containsKey(key))
                {       
                    IntWritable count = (IntWritable)incrementingMap.get(key);
                    count.set(count.get()+val.get());
                }
                else
                {
                    incrementingMap.put(key, val);
                }
            }   
        }

它的输出为:incrementingmap
让{测试=3,游戏=1,让=3,我=4,你=3}
现在我迭代这些元素来求和

Set<Writable> keys = incrementingMap.keySet();

            for(Writable mykey : keys)
            {
                IntWritable val = (IntWritable)incrementingMap.get(mykey);
                result = result + val.get();
            }

但对于键“let”,返回28。
如果我在做

result = result/2;

incrementingMap.put(new Text("result_final"), new IntWritable(result));

最终结果=10
我很困惑:
1-递增Map的所有元素之和的输出应该是14,结果是28。
当我做结果/2(28/2)时,它给我10。
你能解释一下我做错了什么吗?

暂无答案!

目前还没有任何答案,快来回答吧!

相关问题