按键完成Hadoop分组错误

时间:2014-12-05 09:58:20

标签: hadoop mapreduce

这是我的代码

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

可能是什么原因?

1 个答案:

答案 0 :(得分:0)

我发现了问题。

由于某些限制,我使用了Hadoop 0.20.2。问题是Hadoop中有一个错误已在某些版本中解决,但在我使用的版本中没有解决。

https://issues.apache.org/jira/browse/MAPREDUCE-5777

此版本不适用于UTF-8文件。该文件需要保存为UTF-8而无需BOM。

纠正后,一切都按预期进行。