8

我在 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}}

有任何想法吗?

4

2 回答 2

3

您的reduce函数应该总结这些count值,而不仅仅是1为每个值添加。否则 a 的输出reduce不能正确地用作输入回 another reduce。试试这个:

var R = function (key, values) {
  var sum = 0;
  values.forEach(function(x) {
    sum += x.count;
  });
  var result = {
    count : sum 
  };
  return result;
}
于 2012-11-10T03:55:51.260 回答
2

如果 emits 数量等于或大于 100,则将发送 100 个 emits 到 reduce 函数并处理:

{count: 100}

然后只剩下1个emit,发送到reduce函数和进程:

{count: 1}

好的,现在的结果是:

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

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

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

于 2012-11-10T04:47:51.670 回答