如何使用java访问haoop mapreduce中iterable< doublewriteable>的第一个元素?

bxpogfeg  于 2021-05-29  发布在  Hadoop
关注(0)|答案(1)|浏览(429)

我正在尝试使用hadoop mapreduce查找值列表的最小值和最大值,下面是我如何实现reduce代码:

如你所见,我在计算方面没有问题 "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");
            }
        }
tp5buhyn

tp5buhyn1#

实际上,最安全最快的方法就是使用 -Double.MAX_VALUE 最大值和 Double.MAX_VALUE 对于min,因为不需要两次获得迭代器。但如果仍要使用第一个元素,可以这样使用:

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

相关问题