java - 在 hadoop 中定义数据类型

标签 java hadoop

我用Java写过Hadoop的程序,想在Java程序中定义自己的数据类型。这是 reference

这是我的代码:

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);
    }
}

然而,由于我只是完全复制了reference中的代码我在编译程序时遇到问题,错误如下:

The information is here

所以,谁能告诉我我该怎么办?谢谢!

最佳答案

按照它们在终端中出现的顺序

WritableComparable 需要指定一个类型。尝试在类声明中进行以下更改,看看它是否有效。

public class Middle implements WritableComparable<Middle> {

如果这不起作用,请尝试让 compareTo 方法将 Object 作为参数而不是 Middle


对于第一个找不到符号:出现这种情况是因为对象中没有名为value 的字段。我怀疑这应该是 this.number 而不是 this.value

第二个类似的事情找不到符号错误

最后的错误是因为你的中间类被定义为非静态嵌套类(内部类)。内部类不能实例化,除非它们已经在外部类的实例中。但是,您永远不会实例化 Co 类,因此无法实例化 Middle 类。尝试将 middle 移至另一个类,或在 main 方法中实例化 Co,并让其余代码发生在非静态 run(String[] args) 方法中。参见 Oracle 的 explaination of nested classes了解更多信息

如果您想要 WritableComparable 类的更好示例,请查看 here

关于java - 在 hadoop 中定义数据类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29305603/

相关文章:

java - 无法在我的集群上启动 Spark

java - 图像未导出到 Jar 文件

java - 添加 java8 支持时出现 Android Studio 错误

java - 将对象克隆到列表中,并为每个项目更改多个值

hadoop - 一个副本的修改也会改变其他两个副本吗?

hadoop - HIVE中的期间数据类型支持到TERADATA导出

java - 谁能给我一个关于如何有效地将大量小文件从本地合并到 HDFS 中的整个文件的建议

java - Android:将 SSL 证书作为流或字节 []

java - reducer 可以将消息传递给Hadoop mapreduce中的驱动程序吗?

java - 使用 Kundera 在 hbase 中使用通用对象类型