我正在编写一个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));
}
}
答案 0 :(得分:1)
据我所知,mapper中的问题是getBytes();
而不是
String textLine = new String(value.getBytes());
试一试。
String textLine = value.toString();