2013-04-08 3 views
1

Я новичок в hadoop. Я получил этот код из чистогоhasoop компиляция

import java.io.IOException; 
import java.util.*; 

import org.apache.hadoop.fs.Path; 
import org.apache.hadoop.conf.*; 
import org.apache.hadoop.io.*; 
import org.apache.hadoop.mapred.*; 
import org.apache.hadoop.util.*; 

public class Gender { 

    private static String genderCheck = "female"; 

    public static class Map extends MapReduceBase implements Mapper { 
     private final static IntWritable one = new IntWritable(1); 
     private Text locText = new Text(); 

     public void map(LongWritable key, Text value, OutputCollector output, Reporter reporter) throws IOException { 
      String line = value.toString(); 
      String location = line.split(",")[14] + "," + line.split(",")[15]; 
      long male = 0L; 
      long female = 0L; 
      if (line.split(",")[17].matches("\d+") && line.split(",")[18].matches("\d+")) { 
       male = Long.parseLong(line.split(",")[17]); 
       female = Long.parseLong(line.split(",")[18]); 
      } 
      long diff = male - female; 
      locText.set(location); 
      if (Gender.genderCheck.toLowerCase().equals("female") && diff < 0) { 
       output.collect(locText, new LongWritable(diff * -1L)); 
      } 
      else if (Gender.genderCheck.toLowerCase().equals("male") && diff 
> 0) { 
       output.collect(locText, new LongWritable(diff)); 
      } 
     } } 

    public static void main(String[] args) throws Exception { 
     JobConf conf = new JobConf(Gender.class); 
     conf.setJobName("gender"); 
     conf.setOutputKeyClass(Text.class); 
     conf.setOutputValueClass(LongWritable.class); 
     conf.setMapperClass(Map.class); 

     if (args.length != 3) { 
      System.out.println("Usage:"); 
      System.out.println("[male/female] /path/to/2kh/files /path/to/output"); 
      System.exit(1); 
     } 

     if (!args[0].equalsIgnoreCase("male") && !args[0].equalsIgnoreCase("female")) { 
      System.out.println("first argument must be male or female"); 
      System.exit(1); 
     } 
     Gender.genderCheck = args[0]; 

     conf.setInputFormat(TextInputFormat.class); 
     conf.setOutputFormat(TextOutputFormat.class); 
     FileInputFormat.setInputPaths(conf, new Path(args[1])); 
     FileOutputFormat.setOutputPath(conf, new Path(args[2])); 
     JobClient.runJob(conf); } 

} 

, когда я скомпилировать этот код, используя «JAVAC -cp /usr/local/hadoop/hadoop-core-1.0.3.jar Gender.java»

получая следующее ошибка:

"Gender.Map is not abstract and does not override abstract method map(java.lang.Object,java.lang.Object,org.apache.hadoop.mapred.OutputCollector,org.apache.hadoop.mapred.Reporter) in org.apache.hadoop.mapred.Mapper public static class Map extends MapReduceBase implements Mapper "

Как скомпилировать его правильно?

ответ

1

Изменить объявление класса Класс Maper следующим образом:

public static class Map extends MapReduceBase implements Mapper<LongWritable,Text,Text, LongWritable> 

Если вы не указали никаких конкретных имен классов, вы должны были бы иметь функцию карты следующим образом:

@Override 
public void map(Object arg0, Object arg1, OutputCollector arg2, Reporter arg3) throws IOException { 
    // TODO Auto-generated method stub 
} 

Теперь, конкретные типы обозначают здесь ожидаемые типы входных значений ключа-значения и типы значений ключа вывода из преобразователя.

В вашем случае пара ключ-значение входа - LongWritable-Text.

И, угадывая ваши вызовы методов output.collect, ваша пара ключей ключ-карта выводит Text-LongWritable.

Следовательно, ваш класс карты должен использовать Mapper<LongWritable,Text,Text, LongWritable>.

Существовал еще одна ошибка в коде -

Использование "\d+" не будет компилироваться \d не имеет никакого значения, после обратной косой черты он ожидает специальной последовательности бежать, так что я думаю, для вас должно работать: line.split(",")[17].matches("\\d+")

0

Изменить класс карты следующим образом:

public static class Map extends MapReduceBase implements Mapper <Input key, Input value, Output Key , Output Value> 

В вашем случае ввода ключа является LongWritable, входное значение Text, выходной ключ Text, выходное значение LongWritable

public static class Map extends MapReduceBase implements Mapper <LongWritable, Text, Text,LongWritable> 
Смежные вопросы