manupulating itérateur dans mapreduce

Je suis en train d'essayer de trouver la somme des points de l'utilisation d'hadoop, La question que je vais avoir c'est de trouver toutes les valeurs à partir d'une clé dans un seul réducteur. Il ressemble à ceci.

Réducteur:

 public static class Reduce extends MapReduceBase implements
        Reducer<Text, IntWritable, Text, DoubleWritable> {

    public void reduce(Text key, Iterator<IntWritable> values,
            OutputCollector<Text, DoubleWritable> output, Reporter reporter)
            throws IOException {
        Text word = new Text();

        Iterator<IntWritable> tr = values;
        IntWritable v;
        while (tr.hasNext()) {
             v = tr.next();

            Iterator<IntWritable> td = values;
            while (td.hasNext()) {

                IntWritable u = td.next();
                double sum = u+v;
                word.set( u + " + " + v);
                output.collect(word, new DoubleWritable(sum));
            }
        }
    }
}

Et je suis en train de créer deux copies de l'Itérateur variable de sorte que je peux passer par toutes les valeurs de la deuxième itérateur alors que je reçois une valeur unique de la précédente Itérateur( Deux boucles while ci-dessus), mais les deux itérateurs contenir la même valeur, tout le temps.

Je ne suis pas sûr si c'est la bonne façon de le faire, Toute aide est très apprécié.

Merci,

Tsegay

Je suis aussi en train d'essayer de comprendre un problème similaire. J'ai besoin d'aller sur les enregistrements de deux fois dans la fonction de réduction. Je suis en utilisant hadoop streaming avec python et ne sais pas comment rembobiner l'itérateur pour les enregistrements dans le réducteur.
Les itérateurs, par définition, se déplacent dans une seule direction. Donc, une fois que vous avez fait .next() vous avancé, de toute autre instance de l'itérateur vous a tenu également à rappeler à la valeur suivante. Ce n'est rien de spécifique à Hadoop. Quand vous avez dit "essayer de créer deux copies de l'Itérateur variable", vous, en fait, ne pas créer de copie, ils sont tous les deux le même cas, comme @casper a dit. Cela dit, réduire la carte ne peut pas être une bonne solution pour ce problème, un autre moyen serait d'exécuter les boucles while imbriquées à l'extérieur de M/R une fois que vous écrivez le réducteur de sortie quelque part.

OriginalL'auteur tkt986 | 2010-08-14