java - mvn - org apache hadoop mapreduce mapper jar



카운트의 차이를 mapreduce (1)

각 행에 대한 매퍼에서 col1과 col2에 대해 두 개의 키를 생성합니다. 여기에서 값은 각 열에서 계산됩니다.

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} 및 2 : {0, 1}

그런 다음 감속기에서 각 회선이 reduce 통화의 키와 값 조합 인 결과를 얻습니다.

1 -> {0, 1}, {1,0}, {0, 1} (추가하면 -1이됩니다)

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

3 -> {0, 1}, {1, 0} (추가하면 0이됩니다)

4 -> {1, 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) );
  }
}

두 열의 개수 사이의 차이를 출력하는 프로그램을 작성하려고합니다. 그래서 내 데이터는 다음과 같습니다.

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

나는 col1에있는 key의 발생과 col2에있는 key의 발생을 세고 차이를 만들고 싶다. 출력은 다음과 같아야합니다.

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

이것은 하나의 mapreduce 절차 (매퍼, 감속기)에서 수행 할 수 있습니까?





mapreduce