这是我的代码
public class SJob {
public static void main(String[] args) throws IOException, InterruptedException, ClassNotFoundException
{
Job job = new Job();
job.setJarByClass(SJob.class);
job.setJobName("SJob");
FileInputFormat.addInputPath(job, new Path("/home/WORK/input/data.csv"));
FileOutputFormat.setOutputPath(job, new Path("/home/WORK/output"));
job.setMapperClass(SMapper.class);
job.setReducerClass(SReducer.class);
job.setOutputKeyClass(Text.class);
job.setOutputValueClass(Text.class);
job.waitForCompletion(true);
}
}
public class SMapper extends Mapper<LongWritable, Text, Text, Text>{
@Override
protected void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException {
String line = value.toString();
String parts[] = line.split(";");
context.write(new Text(parts[0]), new Text(parts[1]));
}
}
public class SReducer extends Reducer<Text, Text, Text, Text>{
@Override
protected void reduce(Text key, Iterable<Text> values, Context context) throws IOException, InterruptedException {
String properties = "";
int noOfElements = 0;
for(Text value : values)
{
properties += value + " ";
noOfElements++;
}
properties += " " + noOfElements;
context.write(key, new Text(properties));
}
}
这是我的输入文件
1;一个
2;一
3;一
4;一
1,B
2,B
3,B
4,B
1;ç
2;ç
3;ç
4;ç
这是我的输出文件
1 b c 2
2 a b c 3
3 a b c 3
4 a b c 3
1 a 1
正如您所看到的,按键分组执行效果不佳,输出应为
1 a b c 3
2 a b c 3
3 a b c 3
4 a b c 3
看起来处理第一行时出现问题,我尝试交换第一行和第二行,然后发生同样的事情,在这种情况下代替
2 a b c 3
我得到了
2 b c 2
2 a 1
可能是什么原因?
答案 0 :(得分:0)
我发现了问题。
由于某些限制,我使用了Hadoop 0.20.2。问题是Hadoop中有一个错误已在某些版本中解决,但在我使用的版本中没有解决。
https://issues.apache.org/jira/browse/MAPREDUCE-5777
此版本不适用于UTF-8文件。该文件需要保存为UTF-8而无需BOM。
纠正后,一切都按预期进行。