hadoop mapreduce Mapper从文本文件中读取不正确的值

时间:2015-03-30 22:32:06

标签: java hadoop mapreduce

我正在编写一个mapreduce程序来处理一个文本文件,在每一行附加一个字符串。我面临的问题是mapper的map方法中的文本值是不正确的。

每当文件中的一行比前一行少时,行中会自动附加少量字符,使行长度等于前一行读数。

地图方法参数如下

*@Override
protected void map(LongWritable key, Text value, Context context)
        throws IOException, InterruptedException {*

我正在map方法中记录值并观察此行为。 有什么指针吗?

代码段

Driver

Configuration configuration = new Configuration();
        configuration.set("CLIENT_ID", "Test");
        Job job = Job.getInstance(configuration, JOB_NAME);
        job.setJarByClass(JobDriver.class);
        job.setMapperClass(AdwordsMapper.class);
        job.setInputFormatClass(TextInputFormat.class);
        job.setOutputFormatClass(TextOutputFormat.class);
        job.setOutputKeyClass(Text.class);
        job.setOutputValueClass(Text.class);
        FileInputFormat.setInputPaths(job, new Path(args[0]));
        FileOutputFormat.setOutputPath(job, new Path(args[1]));
        FileOutputFormat.setCompressOutput(job, true);
        FileOutputFormat.setOutputCompressorClass(job, GzipCodec.class);

        System.exit(job.waitForCompletion(true) ? 0 : 1);


Mapper

public class AdwordsMapper extends Mapper<LongWritable, Text, Text, Text> {

    @Override
    protected void map(LongWritable key, Text value, Context context)
            throws IOException, InterruptedException {
        String textLine = new String(value.getBytes());

        textLine = new StringBuffer(textLine).append(",")
                .append(context.getConfiguration().get("CLIENT_ID")).toString();
        context.write(new Text(""), new Text(textLine));

    }

}

1 个答案:

答案 0 :(得分:1)

据我所知,mapper中的问题是getBytes();

而不是

   String textLine = new String(value.getBytes());

试一试。

   String textLine = value.toString();