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

最好的方法是将您的 TextPair 放在一个单独的 .java 文件中。随着 mapper 和 reducer 的增长,最好也将它们放在单独的文件中。
话虽如此,您还可以将 TextPair 类定义为静态的,就像 Mapper 和 Reducer 一样。

于 2012-11-03T07:46:16.890 回答
1

你必须定义你的TextPairas static。如果没有 的外部实例,它就无法实例化Myprog。由于您Mapper是静态的,因此它没有Myprog要引用的实例。

使用

public static class TextPair 

将解决您的问题。

于 2012-11-03T08:40:56.760 回答