我是hadoop的新手。我从网上获得了这段代码
import java.io.IOException;
import java.util.*;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.conf.*;
import org.apache.hadoop.io.*;
import org.apache.hadoop.mapred.*;
import org.apache.hadoop.util.*;
public class Gender {
private static String genderCheck = "female";
public static class Map extends MapReduceBase implements Mapper {
private final static IntWritable one = new IntWritable(1);
private Text locText = new Text();
public void map(LongWritable key, Text value, OutputCollector output, Reporter reporter) throws IOException {
String line = value.toString();
String location = line.split(",")[14] + "," + line.split(",")[15];
long male = 0L;
long female = 0L;
if (line.split(",")[17].matches("\d+") && line.split(",")[18].matches("\d+")) {
male = Long.parseLong(line.split(",")[17]);
female = Long.parseLong(line.split(",")[18]);
}
long diff = male - female;
locText.set(location);
if (Gender.genderCheck.toLowerCase().equals("female") && diff < 0) {
output.collect(locText, new LongWritable(diff * -1L));
}
else if (Gender.genderCheck.toLowerCase().equals("male") && diff
> 0) {
output.collect(locText, new LongWritable(diff));
}
} }
public static void main(String[] args) throws Exception {
JobConf conf = new JobConf(Gender.class);
conf.setJobName("gender");
conf.setOutputKeyClass(Text.class);
conf.setOutputValueClass(LongWritable.class);
conf.setMapperClass(Map.class);
if (args.length != 3) {
System.out.println("Usage:");
System.out.println("[male/female] /path/to/2kh/files /path/to/output");
System.exit(1);
}
if (!args[0].equalsIgnoreCase("male") && !args[0].equalsIgnoreCase("female")) {
System.out.println("first argument must be male or female");
System.exit(1);
}
Gender.genderCheck = args[0];
conf.setInputFormat(TextInputFormat.class);
conf.setOutputFormat(TextOutputFormat.class);
FileInputFormat.setInputPaths(conf, new Path(args[1]));
FileOutputFormat.setOutputPath(conf, new Path(args[2]));
JobClient.runJob(conf); }
}
当我使用“javac -cp /usr/local/hadoop/hadoop-core-1.0.3.jar Gender.java”编译此代码时
收到以下错误:
“Gender.Map不是抽象的,不会覆盖抽象方法 地图(java.lang.Object中,java.lang.Object中,org.apache.hadoop.mapred.OutputCollector,org.apache.hadoop.mapred.Reporter) 在org.apache.hadoop.mapred.Mapper中 public static class Map extends MapReduceBase实现了Mapper“
如何正确编译?
答案 0 :(得分:1)
更改类Maper类声明,如下所示:
public static class Map extends MapReduceBase implements Mapper<LongWritable,Text,Text, LongWritable>
如果您没有指定任何特定的类名,则需要具有以下地图功能:
@Override
public void map(Object arg0, Object arg1, OutputCollector arg2, Reporter arg3) throws IOException {
// TODO Auto-generated method stub
}
现在,特定类型在此表示预期的输入键值对类型和映射器中的输出键值类型。
在您的情况下,输入键值对为LongWritable-Text
。
并且,从您的output.collect
方法调用中猜测,您的映射器输出键值对是Text-LongWritable
。
因此,您的Map类应实现Mapper<LongWritable,Text,Text, LongWritable>
。
您的代码中还有一个错误 -
使用"\d+"
将无法编译,因为\d
没有意义,在反斜杠后它需要一个特殊的转义序列,所以我猜你以下应该有效:
line.split(",")[17].matches("\\d+")
答案 1 :(得分:0)
按如下方式更改地图类:
public static class Map extends MapReduceBase implements Mapper <Input key, Input value, Output Key , Output Value>
在您的情况下,输入键为LongWritable
,输入值为Text
,输出键为Text
,输出值为LongWritable
public static class Map extends MapReduceBase implements Mapper <LongWritable, Text, Text,LongWritable>