MapReduce结果似乎限于100?

时间:2012-11-10 02:56:38

标签: python mongodb mapreduce pymongo

我正在使用MongoDB和python中的Map Reduce,我遇到了一个奇怪的限制。我只想计算“书”记录的数量。它在少于100条记录时起作用,但当它超过100条记录时,由于某种原因,计数会重置。

这是我的MR代码和一些示例输出:

var M = function () {
book = this.book;
emit(book, {count : 1});
}

var R = function (key, values) {
var sum = 0;
values.forEach(function(x) {
sum += 1;
});
var result = {
count : sum 
};
return result;
}

记录计数为99时的MR输出:

{u'_id': u'superiors', u'value': {u'count': 99}}

记录计数为101时的MR输出:

{u'_id': u'superiors', u'value': {u'count': 2.0}}

有什么想法吗?

2 个答案:

答案 0 :(得分:3)

您的reduce函数应该总结count个值,而不仅仅是为每个值添加1。否则,reduce的输出无法正确用作另一个reduce的输入。试试这个:

var R = function (key, values) {
  var sum = 0;
  values.forEach(function(x) {
    sum += x.count;
  });
  var result = {
    count : sum 
  };
  return result;
}

答案 1 :(得分:2)

如果发出的数字等于或大于100,将首先发送100个发射以减少功能并处理:

{count: 100}

然后只剩下1个发射,发送以减少功能和处理:

{count: 1}

好的,结果现在是:

[{count: 100}, {count: 1}]

然后这将再次调用reduce函数(非常重要!)。因为代码中有foreach sum+=1。数组中有两个元素,因此结果为2

参考:http://www.mongodb.org/display/DOCS/MapReduce#MapReduce-Amoretechnicalexplanation