我用java编写了hadoop的程序,我想在java程序中定义自己的数据类型。这是参考资料
这是我的密码:
import java.io.IOException;
import java.util.HashSet;
import java.util.Set;
import java.util.StringTokenizer;
import java.util.HashMap;
import java.util.Iterator;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.DoubleWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.io.WritableComparable;
import java.io.DataInput;
import java.io.DataOutput;
import java.io.IOException;
import org.apache.hadoop.mapreduce.Job;
import org.apache.hadoop.mapreduce.Mapper;
import org.apache.hadoop.mapreduce.Reducer;
import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;
import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;
public class Co {
public class Middle implements WritableComparable {
public int number;
public String page;
Middle() {
number = -1;
page = "";
}
public void write(DataOutput out) throws IOException {
out.writeInt(number);
out.writeUTF(page);
}
public void readFields(DataInput in) throws IOException {
number = in.readInt();
page = in.readUTF();
}
public int compareTo(Middle o) {
int thisValue = this.value;
int thatValue = o.value;
return (thisValue < thatValue ? -1 : (thisValue == thatValue ? 0 : 1));
}
}
public static class TokenizerMapper extends Mapper<Object, Text, Text, Middle> {
public void map(Object key, Text value, Context context) throws IOException, InterruptedException {
Middle temp = new Middle();
temp.page = "1";
temp.number = 1;
context.write(new Text("A"), temp);
}
}
public static class IntSumReducer extends Reducer<Text, Middle, Text, DoubleWritable> {
public void reduce(Text key, Iterable<Middle> values, Context context) throws IOException, InterruptedException {
context.write(new Text("A"), new DoubleWritable(0.0));
}
}
public static void main(String[] args) throws Exception {
Configuration conf = new Configuration();
Job job = Job.getInstance(conf, "word count");
job.setJarByClass(Co.class);
job.setMapperClass(TokenizerMapper.class);
job.setCombinerClass(Mycombiner.class);
job.setReducerClass(IntSumReducer.class);
job.setOutputKeyClass(Text.class);
job.setOutputValueClass(Middle.class);
FileInputFormat.addInputPath(job, new Path(args[0]));
FileOutputFormat.setOutputPath(job, new Path(args[1]));
System.exit(job.waitForCompletion(true) ? 0 : 1);
}
}
但是,由于我只是完全复制了参考资料中的代码,因此在编译程序时遇到了问题,下面是错误:
那么,谁能告诉我该怎么做?谢谢!
1条答案
按热度按时间20jt8wwn1#
按它们在候机楼的出现顺序排列
writablecomparable需要指定类型。在类声明中尝试下面的更改,看看是否有效。
如果这不起作用,试着让
compareTo
方法将对象作为参数而不是中间参数对于第一个找不到符号:发生这种情况是因为没有调用
value
在对象中。我想这应该是this.number
而不是this.value
第二个类似的东西找不到符号错误最后一个错误是因为您的中间类被定义为非静态嵌套类(内部类)。内部类不能示例化,除非它们已经在外部类的示例中。但是,您从未示例化co类,因此无法示例化中间类。尝试将中间类移动到另一个类,或者在main方法中示例化co,并让其余的代码在非静态方法中发生
run(String[] args)
方法。有关详细信息,请参阅oracle的嵌套类说明如果你想要一个更好的可写类的例子,请点击这里