2013-02-25 42 views
1

这里是我的地图,减少和最终确定的功能。有4条匹配的密钥和结果来正确时,MapReduce的是用更少的数据(100S)调用,但constanly得到数为2时的MapReduce与更多的数据(1000少)调用。我检查了Reduce函数,对我来说它似乎是正确的,即使它在内部被多次调用大数据。这是越来越奇怪,我花了很长时间,仍然不能正确。MongoDB中的MapReduce - 丢失的数据

var map1 = function(){ 
    var mapPosCnt = 0, mapPosSum = 0, mapZeroCnt = 0; 
    if (isNumber(this.val1)){ 
     if(this.val1.toPrecision(10) > 0.0000000000){ 
      mapPosCnt = 1; 
      mapPosSum = this.val1; 
     }else{ 
      mapZeroCnt = 1; 
     } 
    }else{ 
     mapPosCnt = 0, mapPosSum = 0, mapZeroCnt = 0; 
    } 
    emit({key1: this.key1, key2: this.key2+'', val1: 'val1'} 
     ,{key1: this.key1, key2: this.key2+'', posCnt: mapPosCnt, posSum: mapPosSum, posAvg: 0, zeroCnt: mapZeroCnt, val1: this.val1}); 
} 
var reduce1 = function(key, values){ 
    var retval = {key1: key.CE, key2: key.key2, posCnt: 0, posSum: 0, posAvg: 0, zeroCnt: 0, val1: 0}; 
    values.forEach(function(value){ 
     if (isNumber(value.val1)){ 
      if(value.val1.toPrecision(10) > 0.0000000000){ 
       retval.posCnt += 1; 
       retval.posSum += value.val1; 
      }else{ 
       retval.zeroCnt += 1; 
      } 
     } 
    }) 
    return retval; 
} 
var finalize1 = function(key, value){ 
    value.key2 = value.key2.toString(); 
    if(value.posCnt > 0){ 
     value.posSum = Math.round(value.posSum * Math.pow(10, 6))/Math.pow(10, 6); 
     value.posAvg = Math.round((value.posSum/value.posCnt) * Math.pow(10, 6))/Math.pow(10, 6); 
    } 
    return value; 
} 
collection1.mapReduce(map1, reduce1, {out: {merge: 'collection2'}, finalize: finalize1}, function(err, collection){}); 

回答

1

没有文件来测试它,我猜了一点,但我可以看到几个问题:

  1. 的发射/减小值不应该包括的重点领域。所以,你发出的值应该是这样的,而不是:{ posCnt: mapPosCnt, posSum: mapPosSum, zeroCnt: mapZeroCnt }
  2. reduce函数不应该尝试像你这样做重新申请所述发送逻辑,而是应该由它们的值的总和来聚集与相同的密钥值。

所以reduce1应该是这样的:

var reduce1 = function(key, values){ 
    var retval = { posCnt: 0, posSum: 0, zeroCnt: 0 }; 
    values.forEach(function(value){ 
     retval.posCnt += value.posCnt; 
     retval.posSum += value.posSum; 
     retval.zeroCnt += value.zeroCnt; 
    }); 
    return retval; 
}; 
+0

非常感谢约翰尼;修复您提到的两个问题,解决了我面临的随机丢失的数据问题。很抱歉,由于我整个星期都被拖入不同的任务,并且只是在这方面做了工作。 – user1549605 2013-03-01 23:02:34