2016-11-09 5 views
0

Mapreduceで単純なグループbyを実装しようとしました。ReducerクラスがHadoop MapReduceで期待どおりに動作しない

の下に与えられた私の入力ファイル:

7369,SMITH,CLERK,800,20 
7499,ALLEN,SALESMAN,1600,30 
7521,WARD,SALESMAN,1250,30 
7566,JONES,MANAGER,2975,20 
7654,MARTIN,SALESMAN,1250,30 
7698,BLAKE,MANAGER,2850,30 
7782,CLARK,MANAGER,2450,10 
7788,SCOTT,ANALYST,3000,20 
7839,KING,PRESIDENT,5000,10 
7844,TURNER,SALESMAN,1500,30 
7876,ADAMS,CLERK,1100,20 
7900,JAMES,CLERK,950,30 
7902,FORD,ANALYST,3000,20 
7934,MILLER,CLERK,1300,10 

マイマッパークラス:

public class Groupmapper extends Mapper<Object,Text,IntWritable,IntWritable> { 
    @Override 
    public void map(Object key, Text value, Context context) throws IOException, InterruptedException{ 
     String line = value.toString(); 
     String[] parts=line.split(","); 
     String token1=parts[3]; 
     String token2=parts[4]; 
     int deptno=Integer.parseInt(token2); 
     int sal=Integer.parseInt(token1); 
     context.write(new IntWritable(deptno),new IntWritable(sal)); 
    }  
} 

リデューサークラス:

public class Groupreducer extends Reducer<IntWritable, IntWritable, IntWritable, IntWritable> { 
    IntWritable result=new IntWritable(); 
    public void Reduce(IntWritable key,Iterable<IntWritable> values, Context context) throws IOException, InterruptedException{ 
     int sum=0; 
     for(IntWritable val:values){ 
      sum+=val.get(); 
     } 
     result.set(sum); 
     context.write(key,result); 
    } 
} 

ドライバクラス:

public class Group { 
    public static void main(String[] args) throws IOException, InterruptedException, ClassNotFoundException { 
     Configuration conf=new Configuration(); 
     Job job=Job.getInstance(conf,"Group"); 
     job.setJarByClass(Group.class); 
     job.setMapperClass(Groupmapper.class); 
     job.setCombinerClass(Groupreducer.class); 
     job.setReducerClass(Groupreducer.class); 
     job.setOutputKeyClass(IntWritable.class); 
     job.setOutputValueClass(IntWritable.class); 
     FileInputFormat.addInputPath(job, new Path(args[0])); 
     FileOutputFormat.setOutputPath(job, new Path(args[1])); 
     System.exit(job.waitForCompletion(true) ? 0 : 1);   
    } 
} 

予想される出力は次のようになります。

10  8750 
20  10875 
30  9400 

しかし、それは出力以下の通り印刷します。値を集計しませんでした。 同一性低下剤のように機能します。

10  1300 
10  5000 
10  2450 
20  1100 
20  3000 
20  800 
20  2975 
20  3000 
30  1500 
30  1600 
30  2850 
30  1250 
30  1250 
30  950 

リデューサ機能が正しく動作しません。

答えて

3

還元が使用されていないようです。したがって、あなたのレデューサーを詳しく見ることは、デバッグの次のステップになります。

reduceメソッドに@Overrideを追加すると(マップメソッドと同じように)、Method does not override method from its superclassというエラーが表示されます。つまり、hadoopはreduceメソッドを使用せず、デフォルトのID実装を使用します。

問題は、あなたが持っているということです。

public void Reduce(IntWritable key,Iterable<IntWritable> values, Context context)

、それは次のようになります。

public void reduce(IntWritable key,Iterable<IntWritable> values, Context context)

メソッドの名前唯一の違いは、小文字rで開始する必要があります。

関連する問題