2017-05-23 5 views
2

私はhadoopが新しく、サンプルを実行しようとしています本からのプログラムマップからキーで型の不一致:にjava.io.IOException:私はエラーに エラーに直面しています予想org.apache.hadoop.io.Text、org.apache.hadoop.io.LongWritable を受信すると、以下の私のコードですエラー:java.io.IOException:マップのキーの型が一致しません:org.apache.hadoop.io.Text、org.apache.hadoop.io.LongWritableを受け取りました

package com.hadoop.employee.salary; 

import java.io.IOException; 
import org.apache.hadoop.io.FloatWritable; 
import org.apache.hadoop.io.LongWritable; 
import org.apache.hadoop.io.Text; 
import org.apache.hadoop.mapreduce.Mapper; 

public class AvgMapper extends Mapper<LongWritable,Text,Text,FloatWritable>{ 

public void Map(LongWritable key,Text empRec,Context con) throws IOException,InterruptedException{ 
     String[] word = empRec.toString().split("\\t"); 
     String sex = word[3]; 
     Float salary = Float.parseFloat(word[8]); 
     try { 
      con.write(new Text(sex), new FloatWritable(salary)); 
     } catch (IOException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } catch (InterruptedException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 
    } 
} 

package com.hadoop.employee.salary; 

import java.io.IOException; 
import org.apache.hadoop.io.FloatWritable; 
import org.apache.hadoop.io.Text; 
import org.apache.hadoop.mapreduce.Reducer; 

public class AvgSalReducer extends Reducer<Text,FloatWritable,Text,Text> { 

    public void reduce(Text key,Iterable<FloatWritable> valuelist,Context con) 
    throws IOException, 
        InterruptedException 
    { 
     float total =(float)0; 
     int count =0; 
     for(FloatWritable var:valuelist) 
     { 
      total += var.get(); 
      System.out.println("reducer"+var.get()); 
      count++; 
     } 
     float avg =(float) total/count; 
     String out = "Total: " + total + " :: " + "Average: " + avg; 
     try { 
      con.write(key,new Text(out)); 
     } catch (IOException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } catch (InterruptedException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 
    } 
} 

package com.hadoop.employee.salary; 

import java.io.IOException; 
import org.apache.hadoop.fs.Path; 
import org.apache.hadoop.io.Text; 
import org.apache.hadoop.mapreduce.Job; 
import org.apache.hadoop.mapreduce.lib.input.FileInputFormat; 
import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat; 

public class AvgSalary { 

    public static void main(String[] args) throws IOException { 
     // TODO Auto-generated method stub 
     if(args.length!=2) 
     { 
      System.out.println("Please provide twp parameters"); 
     } 
     Job job = new Job(); 
     job.setJarByClass(AvgSalary.class);//helps hadoop in finding the relevant jar if there are multiple jars 
     job.setJobName("Avg Salary"); 
     job.setMapperClass(AvgMapper.class); 
     job.setReducerClass(AvgSalReducer.class); 

     job.setOutputKeyClass(Text.class); 
     job.setOutputValueClass(Text.class); 

     //job.setMapOutputKeyClass(Text.class); 
     //job.setMapOutputValueClass(FloatWritable.class); 
     FileInputFormat.addInputPath(job, new Path(args[0])); 
     FileOutputFormat.setOutputPath(job,new Path(args[1])); 
     try { 
      System.exit(job.waitForCompletion(true)?0:1); 
     } catch (ClassNotFoundException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } catch (InterruptedException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 
    } 
} 

答えて

0

マップメソッドMapを呼び出したマッパーでは、mapである必要があります。このため、mapメソッドをオーバーライドしていないため、デフォルトの実装が呼び出されます。その結果、同じ入力キー/値の型が出力され、キーはLongWritableです。

mapに名前を変更すると、このエラーが修正されます。

+0

ありがとうございます – ronil

関連する問題