Mongo DB Map / Reduce - Reduce wird nicht aufgerufen

8

Ich versuche eine einfache Map-Reduktion in der Mongo-Shell zu machen, aber die Reduce-Funktion wird nie aufgerufen. Das ist mein Code:

%Vor%

Und das Ergebnis ist

%Vor%

}

Was ist los?

Ich benutze MongoDB 1.8.1 32 Bit auf Ubuntu 10.10

    
Adil 10.04.2011, 12:06
quelle

4 Antworten

17

Der Zweck von reduce ist es, ekhem , die Menge der einem bestimmten Schlüssel zugeordneten Werte auf einen einzigen Wert zu reduzieren (aggregierte Ergebnisse). Wenn Sie nur einen Wert für jeden MapReduce-Schlüssel ausgeben, ist keine Reduzierung erforderlich. Die gesamte Arbeit ist erledigt. Aber wenn Sie für ein gegebenes _id zwei Paare ausgeben, wird reduce aufgerufen:

%Vor%

Dies wird mit den folgenden Parametern reduziert:

%Vor%

Wahrscheinlicher ist, dass Sie _id für den MapReduce-Schlüssel beim Filtern des Datasets verwenden möchten: emit nur, wenn der angegebene Datensatz eine Bedingung erfüllt. Aber wieder wird reduce in diesem Fall nicht aufgerufen, was erwartet wird.

    
Tomasz Nurkiewicz 10.04.2011, 12:53
quelle
6

Nun, die MongoDB ruft die Reduce-Funktion für einen Schlüssel nicht auf, wenn es nur einen Wert dafür gibt.

Meiner Meinung nach ist das schlecht. Es sollte meinem Reduzierer-Code überlassen werden, zu entscheiden, ob ein singulärer Wert übersprungen werden soll oder ob etwas daran ausgeführt werden soll.

Nun, wenn ich etwas Operation auf singulärem Wert machen muss, dann schreibe ich die Finalize-Funktion und im Finalize, versuche ich zu unterscheiden, welcher Wert durch den Reducer gegangen ist oder nicht.

Ich bin mir sicher, dass es im Falle von Hadoop nicht so geht.

    
Sandeep Giri 18.07.2014 14:20
quelle
1

Map reduce wird Werte mit einem gemeinsamen Schlüssel zu einem einzigen Wert zusammenfassen.

In diesem Fall ist nichts zu tun, da jeder von der Karte ausgegebene Wert einen anderen Schlüssel hat. Es ist keine Reduzierung erforderlich.

%Vor%

Das ist beim Lesen der Dokumentation nicht ganz klar.

Wenn Sie reduce aufrufen wollten, könnten Sie eine ID wie folgt hart codieren:

%Vor%

Nun werden alle von der Karte ausgegebenen Werte reduziert, bis nur noch einer übrig ist.

    
superluminary 22.07.2015 20:54
quelle
0

Es sollte auch erwähnt werden, dass, gemäß der Dokumentation , "MongoDB kann die reduce-Funktion mehrmals für denselben Schlüssel aufrufen. In diesem Fall wird die vorherige Ausgabe der reduce-Funktion für diesen Schlüssel zu einem der Eingabewerte für den nächsten reduce-Funktionsaufruf für diesen Schlüssel. ".

Außerdem sollte reduce assoziativ, kommutativ und idempotent sein:

%Vor%

Dies bedeutet also, dass die Funktion reduce bereit sein sollte, das Objekt zu empfangen, das das Ergebnis des vorherigen Aufrufs von sich selbst ist. Was (zumindest für mich persönlich) bedeutet, dass mapReduce am besten implementiert wird, wenn die Funktion map (falls möglich) Werte im selben Format wie die Funktion reduce zurückgibt. Dann kann die Funktion reduce implementiert werden, um nur ein Eingabeformat zu unterstützen. Und selbst wenn nur ein Objekt von map ausgegeben wird (und folglich der Aufruf von reduce übersprungen wird), wird im Endergebnis von mapReduce der Wert für die Schlüssel, für die Das reduce wurde nie aufgerufen, hat jedoch immer noch das gleiche Format wie der Wert für den Rest der Schlüssel.

Zum Beispiel, wenn wir folgende Dokumentenstruktur haben:

%Vor%

Die Funktion map kann wie folgt aussehen:

%Vor%

und die Funktion reduce lautet:

%Vor%     
Exander 23.05.2016 15:19
quelle