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:
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.
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.
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.
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:
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:
und die Funktion reduce
lautet:
Tags und Links javascript mapreduce map mongodb reduce