我正在尝试使用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");
}
}
1条答案
按热度按时间tp5buhyn1#
实际上,最安全最快的方法就是使用
-Double.MAX_VALUE
最大值和Double.MAX_VALUE
对于min,因为不需要两次获得迭代器。但如果仍要使用第一个元素,可以这样使用: