我正在使用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}}
有什么想法吗?
答案 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