为什么不能在mapreduce中设置值

时间:2017-04-07 19:09:56

标签: java hadoop mapreduce

我是mapreduce的初学者。我希望我的简化过程如下: 给定一组相同键的输入,如(key1,100),(key1,#50),(key1,#25),我想输出(key1,50 / 100),(key1,25 / 100)。这是#'#'除以没有'#'

的值

因为我认为在地图处理之后,(key1,100)的位置可能是未知的。因此,我遍历整个集合以获取(key1,100)并将#50,#25存储到列表中。然后遍历列表以计算50 / 100,25 / 100。那可以吗?这是我的代码:

public static class MyReducer extends Reducer<Text,Text,Text,Text> {
        private Text reskey = new Text();
        private Text resvalue = new Text();
        private List<String> arr = new ArrayList<String>();

        public void reduce(Text key, Iterable<Text> values,
                           Context context
        ) throws IOException, InterruptedException {
            try {
                String prefix = new String(key.toString());

                int total = 0;
                for (Text val : values) {
                    String value = new String(val.toString());
                    if (!value.contains("#")) {
                        total = Integer.parseInt(value);
                    }else{
                        arr.add(value);
                    }
                }

                for (int i = 0 ; i < arr.size() ; ++i) {
                    String value = arr.get(i);
                    if (value.contains("#")) {
                        String[] words = value.split("#");
                        int number = Integer.parseInt(words[1]);
                        double probability = 1.0 * number / total;
                        reskey.set(prefix);
                        resvalue.set(Double.toString(probability));
                        context.write(reskey, resvalue);
                    }
                }
                arr.clear();
            }catch (Exception e)
            {
                e.printStackTrace();
            }
        }
    }

现在的问题是变量&#39; total&#39;在第二个for循环中始终保持为0.我认为应该在第一个for循环中分配,因为当我在第一个for循环中打印它时它不是0.但是在第二个for循环中它变为0(初始值)。可能是什么原因?谢谢!

0 个答案:

没有答案