2012-11-10 11 views
8

मैं मोंगोडीबी और पायथन में मानचित्र कम करने के साथ खेल रहा हूं और मैंने एक अजीब सीमा में भाग लिया है। मैं सिर्फ "पुस्तक" रिकॉर्ड की संख्या गिनने की कोशिश कर रहा हूं। यह 100 से कम रिकॉर्ड होने पर काम करता है लेकिन जब यह 100 से अधिक रिकॉर्ड चला जाता है तो कुछ कारणों से गिनती रीसेट होती है। जब रिकॉर्ड गिनती 99 हैMapReduce परिणाम 100 तक सीमित लगते हैं?

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; 
} 

एमआर उत्पादन:

यहाँ मेरी एमआर कोड और कुछ नमूना आउटपुट है

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

एमआर उत्पादन जब रिकॉर्ड गिनती है 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 फेंकना बनी हुई है, के लिए भेजा समारोह और इस प्रक्रिया को कम:

{count: 1}

ठीक है, परिणाम है:

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

और फिर इस समारोह फिर से कम हो कॉल करेंगे (बहुत महत्वपूर्ण!)। क्योंकि आपके कोड में foreach sum+=1। सरणी में दो तत्व हैं, इसलिए परिणाम 2 है।

रेफरी: http://www.mongodb.org/display/DOCS/MapReduce#MapReduce-Amoretechnicalexplanation