Hadoop 按键分组做错了



这是我的代码

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。

更正此问题后,一切按预期工作。

相关内容

  • 没有找到相关文章

最新更新