2016-06-30 10 views
1

データセットがあり、各レコードの最小値、最大値、平均値を計算したい(例:userID_1 - minimum_1-- maximum_1 - avg)。Hadoopレデューサーが単一のキーに複数の値を出力する方法

この私のコードは、私はそれは私がその単一のキーのためのそれらの値を書いてみましょうことができます何をすべきかを知っておく必要があります。MapReduceので

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

    public void reduce(Text key, Iterable<IntWritable> values, Context context) 
      throws IOException, InterruptedException { 
     int sum = 0; 
     int visitsCounter = 0; 
     int min = Integer.MAX_VALUE; 
     int max = Integer.MIN_VALUE; 
     float avg; 
     for (IntWritable val : values) { 
      int currentValue = val.get(); 
      sum += currentValue; 
      visitsCounter++; 
      min = Math.min(min, currentValue); 
      max = Math.max(max, currentValue); 
     } 
     avg = sum/visitsCounter; 

     //here can be the supposed edit to let me output (user - min - max - avg) 
     context.write(key, new IntWritable(sum)); 
    } 
} 

答えて

1

データは、両方のキーと値のペアの観点に流れますフェーズ、つまりフェーズをマップしてフェーズを縮小します。

マップレベルとレベルを減らすにはのキーと値のペアをデザインする必要があります。

ここでkeyとvalueのデータ型はWritableです。

キーは複数の値で構成でき、値は複数の値で構成できます。原子値の場合については

は、我々は、我々がテキストデータ型またはユーザー定義のデータ型を使用する複雑なキーと値のデータ例についてIntWritable、DoubleWritable、LongWritable、FloatWritable等...

を使用しています。このシナリオを処理するため

単純溶液文字列オブジェクトに、すべてのこれらの列のテキストデータ型、すなわち、連結を使用して、テキストオブジェクトに、この文字列オブジェクトをシリアル化します。しかし、これはの多くの文字列連結のため大きなデータセットにあります。

カスタム/ユーザー定義データ型を使用して、このようなシナリオを処理します。 WritableまたはWritableComparableインターフェイスを使用してカスタムデータ型を入力します。Hadoop API

public static class Reduce extends Reducer<Text, IntWritable, Text, Text> { 
    Text emitValue = new Text() 
    public void reduce(Text key, Iterable<IntWritable> values, Context context) 
      throws IOException, InterruptedException { 
     int sum = 0; 
     int visitsCounter = 0; 
     int min = Integer.MAX_VALUE; 
     int max = Integer.MIN_VALUE; 
     float avg; 
     for (IntWritable val : values) { 
      int currentValue = val.get(); 
      sum += currentValue; 
      visitsCounter++; 
      min = Math.min(min, currentValue); 
      max = Math.max(max, currentValue); 
     } 
     avg = sum/visitsCounter; 
     String myValue = min + "\t" + max + "\t" + avg; 
     emitValue.set(myValue); 
     //here can be the supposed edit to let me output (user - min - max - avg) 
     context.write(key, emitValue); 
    } 
} 
+0

これは私のために働いた、ありがとう –

関連する問題