2016-01-08 3 views
0

Я работаю над домашним заданием в университете, и мы должны использовать его для создания карты. Я пытаюсь создать новую настраиваемую запись, поскольку я хочу вывести пары ключ-значение как (key, (doc_name, 1)).Hadoop mapreduce настраиваемый настраиваемый статический контекст

public class Detector { 

    private static final Path TEMP_PATH = new Path("temp"); 
    private static final String LENGTH = "gramLength"; 
    private static final String THRESHOLD = "threshold"; 


    public class Custom implements Writable { 

     private Text document; 
     private IntWritable count; 

     public Custom(){ 
      setDocument(""); 
      setCount(0); 
     } 

     public Custom(String document, int count) { 
      setDocument(document); 
      setCount(count); 
     } 

     @Override 
     public void readFields(DataInput in) throws IOException { 
      // TODO Auto-generated method stub 
      document.readFields(in); 
      count.readFields(in); 
     } 

     @Override 
     public void write(DataOutput out) throws IOException { 
      document.write(out); 
      count.write(out); 
     } 

     public int getCount() { 
      return count.get(); 
     } 

     public void setCount(int count) { 
      this.count = new IntWritable(count); 
     } 

     public String getDocument() { 
      return document.toString(); 
     } 

     public void setDocument(String document) { 
      this.document = new Text(document); 
     } 

    } 

    public static class NGramMapper extends Mapper<Text, Text, Text, Text> { 
     private int gramLength; 
     private Pattern space_pattern=Pattern.compile("[ ]"); 
     private StringBuilder gramBuilder= new StringBuilder(); 

     @Override 
     protected void setup(Context context) throws IOException,  InterruptedException{ 
      gramLength=context.getConfiguration().getInt(LENGTH, 0); 
     } 

     public void map(Text key, Text value, Context context) throws IOException, InterruptedException { 
      String[] tokens=space_pattern.split(value.toString()); 
      for(int i=0;i<tokens.length;i++){ 
       gramBuilder.setLength(0); 
       if(i+gramLength<=tokens.length){ 
        for(int j=i;j<i+gramLength;j++){ 
         gramBuilder.append(tokens[j]); 
         gramBuilder.append(" "); 
        } 
        context.write(new Text(gramBuilder.toString()), key); 
       } 
      } 
     } 
    } 


    public static class OutputReducer extends Reducer<Text, Text, Text, Custom> { 

     public void reduce(Text key, Iterable<Text> values, Context context) 
       throws IOException, InterruptedException { 
      for (Text val : values) { 
       context.write(key,new Custom(val.toString(),1)); 
      } 
     } 
    } 

    public static void main(String[] args) throws Exception { 

     Configuration conf = new Configuration(); 
     FileSystem fs = FileSystem.get(conf); 
     conf.setInt(LENGTH, Integer.parseInt(args[0])); 
     conf.setInt(THRESHOLD, Integer.parseInt(args[1])); 

     // Setup first MapReduce phase 
     Job job1 = Job.getInstance(conf, "WordOrder-first"); 
     job1.setJarByClass(Detector.class); 
     job1.setMapperClass(NGramMapper.class); 
     job1.setReducerClass(OutputReducer.class); 
     job1.setMapOutputKeyClass(Text.class); 
     job1.setMapOutputValueClass(Text.class); 
     job1.setOutputKeyClass(Text.class); 
     job1.setOutputValueClass(Custom.class); 
     job1.setInputFormatClass(WholeFileInputFormat.class); 
     FileInputFormat.addInputPath(job1, new Path(args[2])); 
     FileOutputFormat.setOutputPath(job1, new Path(args[3])); 

     boolean status1 = job1.waitForCompletion(true); 
     if (!status1) { 
      System.exit(1); 
     } 
    } 
} 

Когда я компиляции кода в файле класса я получаю эту ошибку:

Detector.java:147: error: non-static variable this cannot be referenced from a static context 
context.write(key,new Custom(val.toString(),1)); 

я следовал Differents учебники о пользовательских записи и мое решение такое же, как и другие. Любое предложение?

+0

Написание пользовательских записей для записи является излишним. Попробуйте использовать Avro: https://avro.apache.org – simleo

ответ

-1

Статические поля и методы совместно используются всеми экземплярами. Они предназначены для значений, которые относятся к классу, а не к конкретному экземпляру. Держитесь подальше от них как можно больше.

Чтобы решить вашу проблему, вам необходимо создать экземпляр экземпляра (создать объект) вашего класса, чтобы время выполнения могло резервировать память для экземпляра; или изменить часть, к которой вы обращаетесь, чтобы иметь доступ к static (не рекомендуется!).

Ключевое слово this для ссылок то, что это на самом деле является экземпляром (отсюда это вещь), а не то, что это static, который в этом случае должен ссылаться на имя класса вместо. Вы используете его в контексте static, который недопустим.

+0

Благодарим вас за ответ. Какой класс вы имеете в виду, мне нужно создать экземпляр? Я создаю экземпляр Custom внутри редуктора «context.write (key, new Custom (val.toString(), 1)); –

+1

Это абсолютно неправильно. Класс 'Custom' должен быть определен как статический, иначе вы не сможете создать его экземпляр, не создавая сначала' Detector'. Нет доступа к полям. –

+0

@ThomasJungblut Я ответил в «общих терминах», следовательно, второй и третий абзацы. 'this' явно не используется, но при создании нового экземпляра' Custom', который не является 'static', как вы указываете, и используется всеми другими классами' static' –

Смежные вопросы