2012-11-10 77 views
8

我在MongoDB和python中使用Map Reduce,我遇到了一個奇怪的限制。我只是想計算「書籍」記錄的數量。它在少於100條記錄時有效,但當它超過100條記錄時,計數因某種原因而重置。MapReduce的結果似乎只限於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; 
} 

MR輸出時記錄數是99:

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

當記錄計數是MR輸出101:

{u'_id': u'superiors', u'value': {u'count': 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; 
} 
+0

謝謝你,那100%是正確的。 – user1813867

2

如果發射數是等於或大於100,100次發射將被髮送到第一降低的功能和過程:

{count: 100}

那麼只有1 EMIT保持,發送到減少的功能和過程:

{count: 1}

OK,現在的結果是:

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

然後這將再次調用reduce函數(很重要!)。因爲你的代碼中有foreach sum+=1。數組中有兩個元素,所以結果是2

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

相關問題