gpt4 book ai didi

java - 在 hadoop 中定义数据类型

转载 作者:可可西里 更新时间:2023-11-01 16:56:24 28 4
gpt4 key购买 nike

我用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/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com