Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/hadoop/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何访问Iterable的第一个元素<;可双写>;在Haoop MapReduce中使用JAVA?_Java_Hadoop_Mapreduce - Fatal编程技术网

如何访问Iterable的第一个元素<;可双写>;在Haoop MapReduce中使用JAVA?

如何访问Iterable的第一个元素<;可双写>;在Haoop MapReduce中使用JAVA?,java,hadoop,mapreduce,Java,Hadoop,Mapreduce,我正在尝试使用Hadoop MapReduce查找值列表的最小值和最大值,下面是我如何实现Reduce代码: 如您所见,我在计算“avg”方面没有问题,但是对于“min”和“max”,我知道正确的方法是分配min=“Iterable的第一个元素”,以及max=“Iterable的第一个元素”。我尝试了这个代码,我已经注释掉了,但是它们不起作用。因此,我临时将min和max分配给一个非常大和非常小的数字 如果有人能教我如何访问Iterable的第一个元素,并在这种情况下将其指定为“min”和“ma

我正在尝试使用Hadoop MapReduce查找值列表的最小值和最大值,下面是我如何实现Reduce代码: 如您所见,我在计算“avg”方面没有问题,但是对于
“min”和
“max”
,我知道正确的方法是分配
min=“Iterable的第一个元素”
,以及
max=“Iterable的第一个元素”
。我尝试了这个代码,我已经注释掉了,但是它们不起作用。因此,我临时将min和max分配给一个非常大和非常小的数字

如果有人能教我如何访问
Iterable
的第一个元素,并在这种情况下将其指定为“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");
            }
        }
public void reduce(文本键、Iterable值、上下文)抛出IOException、InterruptedException
{
如果(此平均值最小值最大值等于(“平均值”))
{
双和=0;
int计数器=0;
for(可双写val:值){
sum+=val.get();
计数器=计数器+1;
}
结果集(总和/计数器);
编写(键、结果);
}
否则如果(此平均最小值最大值等于(“最小值”))
{
//DoubleWritable最小值=新的DoubleWritable(values.get(0));
双最小值=9999999;
for(可双写val:值){
if(val.get()max)
{
max=val.get();
}
}
结果集(最大值);
编写(键、结果);
}
其他的
{
System.out.println(“第三个参数错误。\n它必须是'avg'、'min'或'max'\n”);
}
}

实际上,最安全、最快的方法是使用
-Double.MAX\u值
表示最大值,使用
Double.MAX\u值
表示最小值,因为不需要两次获取迭代器。 但是,如果仍要使用第一个元素,可以如下使用:

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