hadoop中java定义的数据类型

vbopmzt1  于 2021-05-30  发布在  Hadoop
关注(0)|答案(1)|浏览(381)

我用java编写了hadoop的程序,我想在java程序中定义自己的数据类型。这是参考资料
这是我的密码:

  1. import java.io.IOException;
  2. import java.util.HashSet;
  3. import java.util.Set;
  4. import java.util.StringTokenizer;
  5. import java.util.HashMap;
  6. import java.util.Iterator;
  7. import org.apache.hadoop.conf.Configuration;
  8. import org.apache.hadoop.fs.Path;
  9. import org.apache.hadoop.io.IntWritable;
  10. import org.apache.hadoop.io.DoubleWritable;
  11. import org.apache.hadoop.io.Text;
  12. import org.apache.hadoop.io.WritableComparable;
  13. import java.io.DataInput;
  14. import java.io.DataOutput;
  15. import java.io.IOException;
  16. import org.apache.hadoop.mapreduce.Job;
  17. import org.apache.hadoop.mapreduce.Mapper;
  18. import org.apache.hadoop.mapreduce.Reducer;
  19. import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;
  20. import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;
  21. public class Co {
  22. public class Middle implements WritableComparable {
  23. public int number;
  24. public String page;
  25. Middle() {
  26. number = -1;
  27. page = "";
  28. }
  29. public void write(DataOutput out) throws IOException {
  30. out.writeInt(number);
  31. out.writeUTF(page);
  32. }
  33. public void readFields(DataInput in) throws IOException {
  34. number = in.readInt();
  35. page = in.readUTF();
  36. }
  37. public int compareTo(Middle o) {
  38. int thisValue = this.value;
  39. int thatValue = o.value;
  40. return (thisValue < thatValue ? -1 : (thisValue == thatValue ? 0 : 1));
  41. }
  42. }
  43. public static class TokenizerMapper extends Mapper<Object, Text, Text, Middle> {
  44. public void map(Object key, Text value, Context context) throws IOException, InterruptedException {
  45. Middle temp = new Middle();
  46. temp.page = "1";
  47. temp.number = 1;
  48. context.write(new Text("A"), temp);
  49. }
  50. }
  51. public static class IntSumReducer extends Reducer<Text, Middle, Text, DoubleWritable> {
  52. public void reduce(Text key, Iterable<Middle> values, Context context) throws IOException, InterruptedException {
  53. context.write(new Text("A"), new DoubleWritable(0.0));
  54. }
  55. }
  56. public static void main(String[] args) throws Exception {
  57. Configuration conf = new Configuration();
  58. Job job = Job.getInstance(conf, "word count");
  59. job.setJarByClass(Co.class);
  60. job.setMapperClass(TokenizerMapper.class);
  61. job.setCombinerClass(Mycombiner.class);
  62. job.setReducerClass(IntSumReducer.class);
  63. job.setOutputKeyClass(Text.class);
  64. job.setOutputValueClass(Middle.class);
  65. FileInputFormat.addInputPath(job, new Path(args[0]));
  66. FileOutputFormat.setOutputPath(job, new Path(args[1]));
  67. System.exit(job.waitForCompletion(true) ? 0 : 1);
  68. }
  69. }

但是,由于我只是完全复制了参考资料中的代码,因此在编译程序时遇到了问题,下面是错误:

那么,谁能告诉我该怎么做?谢谢!

20jt8wwn

20jt8wwn1#

按它们在候机楼的出现顺序排列
writablecomparable需要指定类型。在类声明中尝试下面的更改,看看是否有效。

  1. public class Middle implements WritableComparable<Middle> {

如果这不起作用,试着让 compareTo 方法将对象作为参数而不是中间参数
对于第一个找不到符号:发生这种情况是因为没有调用 value 在对象中。我想这应该是 this.number 而不是 this.value 第二个类似的东西找不到符号错误
最后一个错误是因为您的中间类被定义为非静态嵌套类(内部类)。内部类不能示例化,除非它们已经在外部类的示例中。但是,您从未示例化co类,因此无法示例化中间类。尝试将中间类移动到另一个类,或者在main方法中示例化co,并让其余的代码在非静态方法中发生 run(String[] args) 方法。有关详细信息,请参阅oracle的嵌套类说明
如果你想要一个更好的可写类的例子,请点击这里

相关问题