1

このリンクに示されているように、カスタム WritableComparable を実装しようとしています

マッパー メソッド内でカスタムの書き込み可能な同等のクラスを初期化しようとすると、エラーが発生します。コードの横にエラーを表示しました。textpair クラスは別ファイルにする必要がありますか?

public class Myprog {
    public static class MyMap extends Mapper<Object, Text, TextPair, IntWritable> {
        public void map(Object key, Text value, Context context)
            throws IOException, InterruptedException {
            TextPair writable = new TextPair();

           //ERROR in this line 
           //No enclosing instance of type Myprog is accessible. Must qualify 
           //the allocation with an enclosing instance of type Myprog 
           //(e.g. x.new A() where x is an instance of Myprog).
            ....
    }
}

public static class MyReduce extends Reducer<TextPair, IntWritable, Text, Text> {
    public void reduce(TextPair key, Iterable<IntWritable> values, Context context)
        throws IOException, InterruptedException {
    }
}

public class TextPair implements WritableComparable<TextPair> {
      ....
}

public static void main(String[] args) throws Exception {
    Configuration conf = new Configuration();
    String[] otherArgs = 
        new GenericOptionsParser(conf, args).getRemainingArgs();
    Collections.addAll(headerList, header.split(","));
    Job job = new Job(conf, "Myprog");
    job.setJarByClass(Myprog.class);
    job.setMapperClass(MyMap.class);
    job.setReducerClass(MyReduce.class);
    job.setMapOutputKeyClass(TextPair.class); 
    job.setOutputKeyClass(Text.class);
    job.setOutputValueClass(Text.class);

    FileInputFormat.addInputPath(job, new Path(otherArgs[0]));
    FileOutputFormat.setOutputPath(job, new Path(otherArgs[1]));

    System.exit(job.waitForCompletion(true) ? 0 : 1);
}
4

2 に答える 2

1

TextPairasを定義する必要がありますstatic。の外部インスタンスなしではインスタンス化できませんMyprog。あなたMapperは静的であるMyprogため、参照するインスタンスはありません。

使用する

public static class TextPair 

あなたの問題を解決します。

于 2012-11-03T08:40:56.760 に答える
1

最善の方法は、TextPair を別の .java ファイルに入れることです。マッパーとリデューサーが大きくなるにつれて、それらも別のファイルに入れることをお勧めします。
そうは言っても、TextPair クラスを Mapper や Reducer と同じように静的に定義することもできます。

于 2012-11-03T07:46:16.890 に答える