这是我在map / reduce中的第一个程序。我试图在文件中计算元音和辅音的数量,而不是传统的字数统计程序。以下是我的代码。
映射器:
公共类VowelConsMapper扩展了Mapper {public void map(LongWritable mapKey,Text mapValue,Context context) throws IOException, InterruptedException{
String line = mapValue.toString();
String[] letters = line.split("");
for(String letter : letters){
System.out.println(letter);
if(letter!=" "){
if(isVowel(letter))
context.write(new Text("Vowel"), new IntWritable(1));
else
context.write(new Text("Consonant"), new IntWritable(1));
}
}
}
private boolean isVowel(String letter) {
// TODO Auto-generated method stub
if(letter.equalsIgnoreCase("a")||letter.equalsIgnoreCase("e")||letter.equalsIgnoreCase("i")||letter.equalsIgnoreCase("o")||letter.equalsIgnoreCase("u"))
return true;
else
return false;
}
}
减速机:
public class VowelConsReducer extends Reducer<Text, IntWritable, Text, IntWritable> {
public void reducer(Text letterType,Iterable<IntWritable> values,Context context) throws IOException, InterruptedException{
int sum = 0;
for(IntWritable value:values){
sum += value.get();
}
System.out.println(letterType+" "+sum);
context.write(letterType, new IntWritable(sum));
}
}
驱动:
public class VowelConsDriver {
public static void main(String[] args) throws IOException, InterruptedException, ClassNotFoundException {
Configuration conf = new Configuration();
conf.addResource(new Path("/home/hadoop/hadoop-1.0.3/conf/core-site.xml"));
Job job = new Job(conf,"VowelConsDriver");
job.setJarByClass(VowelConsDriver.class);
job.setMapperClass(VowelConsMapper.class);
job.setReducerClass(VowelConsReducer.class);
job.setMapOutputKeyClass(Text.class);
job.setMapOutputValueClass(IntWritable.class);
// TODO: specify output types
job.setOutputKeyClass(Text.class);
job.setOutputValueClass(IntWritable.class);
FileInputFormat.addInputPath(job, new Path("/user/hadoop/WCinput"));
FileOutputFormat.setOutputPath(job, new Path("/user/hadoop/VowelConsOP1"));
job.waitForCompletion(true);
}
}
它给出了以下o / p: 辅音1 辅音1 辅音1 ............... ............... ............... ................ ............... ............... 元音1 元音1 元音1 元音1 ............... ............... ............... ................ ............... ...............
我在哪里期待辅音&amp;每个类别的元音总数 对不起,如果我没有正确格式化代码......&amp;提前谢谢!
答案 0 :(得分:1)
reduce的签名方法是“public void reduce()
”而不是“public void reducer()
”
上述更改将为您提供预期的输出!
答案 1 :(得分:0)
开始的行
public void reducer(
^
应该是
@Override
public void reduce(
您的意图的缩减器未被调用,因为您misnamed the method,因此您获得了default implementation。默认实现只是转储键和值:
for(VALUEIN value: values) {
context.write((KEYOUT) key, (VALUEOUT) value);
}
在您的情况下,键/值对是("Vowel", 1)
或("Consonant", 1)
,因此这解释了您的输出。
这就是为什么在覆盖方法时应始终使用@Override
annotation的原因。编译器会告诉你reducer
实际上没有覆盖任何方法。