8
votes

MongoDB MAP / Réduire - Réduire ne s'appelle pas

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,


0 commentaires

4 Réponses :


18
votes

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'])


4 commentaires

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 , vous devez également ajuster réduire afin d'obtenir des résultats uniformes en cas de valeur unique carte 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 ...



6
votes

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.

À 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.

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.

Je suis très sûr, cela n'arrive pas de cette façon dans le cas d'Hadoop.


1 commentaires

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.



1
votes

la carte Réduire va collecter des valeurs avec une clé commune en une seule valeur. strong>

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


0 commentaires

1
votes

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, Réduire devrait être associatif, commutatif et idempotent: xxx

donc, cela signifie que le < Code> Réduire 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 Mapreduce est de créer la fonction de la fonction à (si possible) émettre des valeurs dans le même format que le Réduire les retours de fonction . Ensuite, la fonction Réduire 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 (et l'invocation de réduire est ignoré, par conséquent), dans le résultat final de la < Code> MapReduce , la valeur des touches pour lesquelles le Réduire n'a jamais été appelé sera toujours au même format que la valeur pour le reste des touches.

Par exemple, si nous avons la structure de document suivante: xxx

la carte La fonction peut être la suivante: xxx

et la fonction Réduire sera la suivante: xxx


0 commentaires