java - example - mongodb mapreduce list



mapreduce différence de nombre (1)

J'essaye d'écrire un programme qui produit les différences entre les comptes dans 2 colonnes. Donc, mes données ressemblent à ceci:

2,1
2,3
1,2
3,1
4,2

Je veux compter les occurrences de clé dans col1 et les occurrences de clés dans col2 et prendre la différence. La sortie devrait ressembler à ceci:

1,-1
2,0
3,0
4,1

cela peut-il être fait dans une procédure mapreduce (mapper, réducteur)?


Dans mapper pour chaque ligne, vous allez créer deux clés, une pour col1 et une autre pour col2 où les valeurs sont comptées à partir de chaque colonne, comme ceci:

2,1 -> 2: {1, 0} et 1: {0, 1}

2,3 -> 2: {1, 0} et 3: {0, 1}

1,2 -> 1: {1, 0} et 2: {0, 1}

3,1 -> 3: {1, 0} et 1: {0, 1}

4,2 -> 4: {1, 0} et 2: {0, 1}

Ensuite, dans le réducteur, vous obtiendrez ces résultats où chaque ligne est la combinaison de touches et de valeurs pour chaque appel de reduce :

1 -> {0, 1}, {1, 0}, {0, 1} (les ajouter produira -1)

2 -> {1, 0}, 2: {1, 0}, 2: {0, 1}, 2: {0, 1} (les ajouter produira 0)

3 -> {0, 1}, {1, 0} (les ajouter produira 0)

4 -> {1, 0} (les ajouter produira 1)

Mettre à jour:

Voici un exemple Hadoop (il n'est pas testé et pourrait nécessiter quelques ajustements pour le faire fonctionner):

public class TheMapper extends Mapper<LongWritable, Text, Text, ArrayPrimitiveWritable>{        

    protected void map(LongWritable offset, Text value, Context context) 
    throws IOException, InterruptedException {

        StringTokenizer tok = new StringTokenizer( value.toString(), "," );

        Text col1 = new Text( tok.nextToken() );
        context.write( col1, toArray(1, 0) );

        Text col2 = new Text( tok.nextToken() );        
        context.write( col2, toArray(0, 1) );
    }

    private ArrayPrimitiveWritable toArray(int v1, int v2){     
        return new ArrayPrimitiveWritable( new int[]{i1, i2} );
    }   
}

public class TheReducer extends Reducer<Text, ArrayPrimitiveWritable, Text, Text> {

  public void reduce(Text key, Iterable<ArrayPrimitiveWritable> values, Context context) 
  throws IOException, InterruptedException {

      Iterator<ArrayPrimitiveWritable> i = values.iterator();
      int count = 0;
      while ( i.hasNext() ){
          int[] counts = (int[])i.next().get();
          count += counts[0];
          count -= counts[1];
      }

      context.write( key, new Text("" + count) );
  }
}




mapreduce