这是我的代码
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;a
2;a
3;a
4;a
1;b
2;b
3;b
4;b
1;c
2;c
3;c
4;c
这是我的输出文件
1 b c 2
2 a b c 3
3 a b c 3
4 a b c 3
1一 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 一 1
可能是什么原因?
我发现了问题。
由于某些限制,我使用了Hadoop 0.20.2。问题是Hadoop中有一个错误在某些版本中已经解决,但在我使用的版本中没有解决。
https://issues.apache.org/jira/browse/MAPREDUCE-5777
此版本不适用于 UTF-8 文件。该文件需要另存为 UTF-8,不带 BOM。
更正此问题后,一切按预期工作。