J'essaie de faire une simple carte de réduction dans la coquille de Mongo, mais la fonction de réduction ne s'appelle jamais. Ceci est mon code:
{ "results" : [ { "_id" : ObjectId("4da0bdb56bd728c276911e1a"), "value" : "Map" }, { "_id" : ObjectId("4da0df9a6bd728c276911e1b"), "value" : "Map" } ], "timeMillis" : 0, "counts" : { "input" : 2, "emit" : 2, "output" : 2 }, "ok" : 1,
4 Réponses :
Le but de Réduire code> est de, ekhem em>, réduisez l'ensemble des valeurs associées à une clé donnée dans une seule valeur (résultats globaux). Si vous n'émettez qu'une seule valeur pour chaque clé MapReduce, il n'est pas nécessaire de réduire, tout le travail est effectué. Mais si vous émettez deux paires pour un
indiqué code>, réduire seront appelés:
reduce(_id, ['Map1', 'Map2'])
Tu as raison Tomasz. J'ai choisi cet exemple de la DOCS MONGODB. Cela aiderait à la carte / réduire les noobs comme moi-même si cela était clairement mentionné. Un humble "Vecue verte" pour vous!
On pourrait toujours être déduit que réduire la réception de votre exemple, en utilisant votre exemple, réduisez (IDID, ['MAP1']) dans le cas de seulement 1 élément émis. Ne pas passer en réduit les pauses mon ensemble de résultats.
Je pense que cela ne pas appeler réduire sur des valeurs simples est un choix d'implémentation étrange. Donc, chaque fois que vous modifiez la structure du résultat de mappe code>, vous devez également ajuster
réduire code> afin d'obtenir des résultats uniformes en cas de valeur unique
carte code> résultats.
Oui, c'est une vraie douleur. Je regagne un gros jeu de données, et cela signifie essentiellement que je ne peux pas regrouper des ensembles qui ne contiennent qu'un seul objet. Choix de mise en œuvre étrange ...
Eh bien, le MongoDB n'appelle pas la fonction de réduction sur une clé s'il n'y a qu'une seule valeur pour cela. P>
À mon avis, c'est mauvais. Il devrait être laissé à mon code de réducteur pour décider de sauter une valeur singulière ou de faire une certaine opération dessus. P>
Maintenant, si je dois faire une certaine opération sur une valeur singulière, je finis par écrire la fonction finalisée et dans la finalisation, j'essaie de différencier la valeur de la valeur du réducteur ou non. P>
Je suis très sûr, cela n'arrive pas de cette façon dans le cas d'Hadoop. P>
Merci! Ceci est très contraire intuitif, une partie des travaux des réducteurs consiste à construire l'article d'une certaine manière qui pourrait très bien être différent.
Dans ce cas, rien ne doit être effectué car chaque valeur émise par carte a une clé différente. Aucune réduction n'est nécessaire. P> db.sellers.mapReduce(
function(){ emit( 1, 'Map') } ,
function(k,vs){ return 'Reduce' },
{ out: { inline: 1}})
Il convient également de mentionner que, selon le documentation ," MongoDB peut appeler la fonction de réduction plus d'une fois pour la même clé. Dans ce cas, la sortie précédente de la fonction de réduction de cette clé deviendra l'une des valeurs d'entrée à la fonction de réduction suivante. Invocation pour cette clé. ".
Aussi, donc, cela signifie que le < Code> Réduire CODE> La fonction doit être prête à recevoir l'objet qui est le résultat de l'invocation précédente de lui-même. Qui (au moins pour moi, personnellement) signifie que le meilleur moyen d'implémenter Par exemple, si nous avons la structure de document suivante: p> la carte code> La fonction peut être la suivante: p> et la fonction code> Réduire code> sera la suivante: p> Réduire code> devrait être associatif, commutatif et idempotent: p>
Mapreduce code> est de créer la fonction
de la fonction code> à (si possible) émettre des valeurs dans le même format que le
Réduire les retours de fonction code>. Ensuite, la fonction code> Réduire code> peut être implémentée pour ne prendre en charge qu'un seul format d'entrée. Et, par conséquent, même s'il n'y a qu'un seul objet émis par
mappe code> (et l'invocation de
réduire code> est ignoré, par conséquent), dans le résultat final de la < Code> MapReduce code>, la valeur des touches pour lesquelles le
Réduire code> n'a jamais été appelé sera toujours au même format que la valeur pour le reste des touches. P>