reducer outputcollector中操作1/double(一个分区一个双精度)中的java hadoop作业异常行为

reducer outputcollector中操作1/double(一个分区一个双精度)中的java hadoop作业异常行为,java,hadoop,mapreduce,division,Java,Hadoop,Mapreduce,Division,在Hadoop MapReduce作业中,使用Java编写 我发现,在削减阶段,该司不稳定。在特定的1/X和X双精度中: double sum = 0; while (values.hasNext()) { sum += values.next().get(); } if (sum != 0) { output.collect(key, new DoubleWritable(1/sum)); } else { output.collect(key, new Dou

在Hadoop MapReduce作业中,使用Java编写 我发现,在削减阶段,该司不稳定。在特定的1/X和X双精度中:

double sum = 0;
 while (values.hasNext())
 {
    sum += values.next().get();
 }
 if (sum != 0) {
    output.collect(key, new DoubleWritable(1/sum));
 } else {
   output.collect(key, new DoubleWritable(1));
 }
值是一个迭代器

当总和不同于零时,有时写1/总和,有时写总和。 这让我发疯。 非常感谢

[已解决] 我还有一个问题,映射器和还原器接口(键值)不同。(文本,可写)第一个(文本,可双写)第二个。 我在“main”中配置了这个东西。错误还在继续,因为我把这一行写错了:

conf.setCombinerClass(Reduce.class);
它需要mapper和reducer中相同的接口(k,v),这不是我的情况; 一切正常。
多亏了Arnon Rotem Gal Oz,我没有名声支持他

你的问题是,在计算和时,浮点值的加法是不可交换的(其原因是double的精度有限)。简单地说:总和受元素添加顺序的影响

下面的代码很好地演示了这一点:

public class DoubleSumDemo {

    public static void main(String[] argv) {
        final ArrayList<Double> list = new ArrayList<Double>();
        // fill list with random values
        for (int i=0; i<1000000; ++i)
            list.add(Math.random());
        // sum the list, print the sum and then reorder the list elements
        while (true) {
            double sum = 0D;
            for (double element : list) 
                sum += element;
            System.out.println("sum is: " + sum);
            Collections.shuffle(list);
        }
    }

}
public类DoubleSumDemo{
公共静态void main(字符串[]argv){
最终ArrayList=新ArrayList();
//用随机值填充列表

对于(int i=0;iSo),您以前从未使用过浮点?问题是什么?不,在hadoop MapReduce job和java中。我的问题是“为什么?”错误在哪里。提示:当添加两个以上的元素时,浮点加法不是可交换的。