Python MapReduce结果似乎仅限于100?
我在MongoDB和python中使用Map Reduce,遇到了一个奇怪的限制。我只是想数一数“书本”记录的数量。当记录少于100条时,它工作,但当超过100条时,由于某种原因,计数会重置 以下是我的MR代码和一些示例输出:Python MapReduce结果似乎仅限于100?,python,mongodb,mapreduce,pymongo,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(functio
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}}
有什么想法吗?您的
reduce
函数应该将计数
值相加,而不仅仅是为每个值添加1
。否则,reduce
的输出不能正确地用作另一个reduce
的输入。请尝试以下方法:
var R = function (key, values) {
var sum = 0;
values.forEach(function(x) {
sum += x.count;
});
var result = {
count : sum
};
return result;
}
如果发射数等于或大于100,将首先发送100个发射以减少功能并处理:
{count:100}
然后只剩下1个发射,发送到reduce函数和进程:
{count:1}
好的,现在的结果是:
[{count:100},{count:1}]
然后,这将再次调用reduce函数(非常重要!)。因为在您的代码中,foreach sum+=1
。数组中有两个元素,因此结果是2
参考: