2017-11-02 12 views
1

私はカウントの差を2列に出力するプログラムを作成しようとしています。だから、私のデータは以下のようになります。私はCOL1内のキーの発生とcol2のキーの発生をカウントし、その差を取りたいmapreduceのカウントの差

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

。出力は次のようになります。

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

これは、1回のマップリダクション手順(マッパー、レデューサー)で実行できますか?もし二つの値が各列からのカウントされたキー、col2のCOL1用と別の、それほどのように作成された各ラインのためのマッパーで

答えて

2

2,1 - > 2:{1,0}及び1:{0,1}

2,3 - > 2:{1,0}及び3:{0,1}

1,2 - > 1:{1,0}と2: {0、1}

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

4,2 - > 4:{1,0}及び> {0,1}、{1,0 -

1:2:{0、1}

その後減速では、各行がキーであり、各reduceコールのための併用値これらの結果を取得します}、{0,1}(加算すると-1が生成されます)

2 - > {1,0}、2:{1,0}、2:{0,1}、2:{0,1 > {1,0}(それらが生成する加算 - > {0,1}、{1,0}

4(追加それらが0生み出す) - }

3(それらを追加すること0を生成します) 1)

アップデート:ここで

は、Hadoopの例である(それはテストされていませんし、それが働いて得るためにいくつかの調整が必要になる場合があります):

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)); 
    } 
} 
+0

おかげで、私はロジックを取得します。これをJavaでどのように実装しますか? public void map {}に2つのオブジェクトキーが必要ですか? – ajax2000