2012-11-10 8 views
8

Używam funkcji Map Reduce w MongoDB i Pythonie, a ja mam dziwne ograniczenie. Po prostu próbuję policzyć liczbę rekordów "książki". Działa, gdy jest mniej niż 100 rekordów, ale kiedy przejdzie ponad 100 rekordów, licznik zresetuje się z jakiegoś powodu.Wyniki MapReduce wydają się być ograniczone do 100?

Oto mój kod MR i niektóre wyjścia przykładowe: wyjście

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 gdy liczba rekord to 99:

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

wyjście MR gdy liczba rekord wynosi 101:

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

Jakieś pomysły?

Odpowiedz

3

Twoja funkcja reduce powinna sumować wartości count, a nie tylko dodawać 1 dla każdej wartości. W przeciwnym razie wyjście reduce nie może być poprawnie użyte jako wejście z powrotem do innego reduce. Spróbuj to zamiast:

var R = function (key, values) { 
    var sum = 0; 
    values.forEach(function(x) { 
    sum += x.count; 
    }); 
    var result = { 
    count : sum 
    }; 
    return result; 
} 
+0

Dziękuję, że był w 100% poprawne. – user1813867

2

Jeśli numery emituje są równe lub większe niż 100, 100 emituje zostanie wysłana najpierw zredukować funkcję i proces:

{count: 100}

Potem tylko 1 emitować pozostaje, wysłał do funkcję i proces zmniejszenia:

{count: 1}

OK, wynik brzmi:

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

A potem to zadzwoni ponownie funkcję zmniejszenia (bardzo ważne!). Ponieważ foreach sum+=1 w kodzie. W macierzy są dwa elementy, więc wynikiem jest 2.

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