如何使用JAVA访问Haoop MapReduce中Iterable <doublewritable>的第一个元素?

时间:2016-12-04 17:26:56

标签: java hadoop mapreduce

我正在尝试使用Hadoop MapReduce查找Min和Max的值列表,以下是我实现Reduce代码的方法: enter image description here 正如您所看到的,我对计算"avg"没有问题,但对于"min""max",我知道正确的方法是分配min = "first element of the Iterable<DoubleWritable>",并且max = "first element of the Iterable<DoubleWritable>"。我尝试了代码,我已经注释掉了,但它们没有用。因此,我暂时将min和max分配给一个非常大的数字和一个非常小的数字。

如果有人可以教我如何访问Iterable<DoubleWritable>的第一个元素,并在这种情况下将其指定为“min”和“max”,我将非常感激。为了您的参考,我还在此处粘贴我的代码:

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

            if (this.avg_min_max.equals("avg"))
            {
                double sum = 0;
                int counter = 0;
                for (DoubleWritable val : values) {
                sum += val.get();
                counter = counter + 1;
                }
                result.set(sum/counter);
                context.write(key, result);
            }
            else if (this.avg_min_max.equals("min"))
            {
                //DoubleWritable min = new DoubleWritable(values.get(0));
                double min = 999999999;
                for (DoubleWritable val : values) {
                    if(val.get() < min)
                    {
                        min = val.get();
                    }
                }
                result.set(min);
                context.write(key, result);
            }
            else if (this.avg_min_max.equals("max"))
            {
                //DoubleWritable max = new DoubleWritable(values.get(0));
                double max = -999999999;
                for (DoubleWritable val : values) {
                    if(val.get() > max)
                    {
                        max = val.get();
                    }
                }
                result.set(max);
                context.write(key, result);
            }
            else
            {
                System.out.println("The third argument is wrong.\n It has to be 'avg', 'min' or 'max'\n");
            }
        }

1 个答案:

答案 0 :(得分:0)

实际上,最安全,最快捷的方法是使用-Double.MAX_VALUE作为最大值,使用Double.MAX_VALUE表示最小值,因为您不需要两次获取迭代器。 但是如果你仍然想要使用第一个元素,你可以像这样使用它:

double max = values.iterator().next().get();