我正在写一个mapreduce作业。这是一项仅限地图的工作。我的输出键包含两个元素,值包含一个元素。从表的角度来看,我希望输出为三列,每行是一条新记录。如果可能的话,应该用一些特殊的字符来分隔。
然而,我很难在Java中实现它。
我的映射器现在看起来像这样:
public class <classname> extends Mapper<AvroKey<<schema.class>>, NullWritable, Map<String, String>, Text>{
public void map(AvroKey<<schema.class>> key, NullWritable value, Context context) throws IOException, InterruptedException {
CharSequence content = key.datum().getContent();
Parser dp = new Parser(content);
dp.parse();
for (Part part : dp.getResults()) {
try {
Map<String, String> myKey = new HashMap<String, String>();
Text myValue = new Text();
myKey.put(part.getKey1(), part.getKey2());
myValue = new Text(part.getValue);
context.write(myKey, myValue);
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
下面是我的工作配置:
..
Job job = new Job(conf);
job.setJarByClass(<classname>.class);
job.setJobName("Parser");
String myPath = "mypath";
FileInputFormat.setInputPaths(job, new Path(myPath
+ "input.avro"));
FileOutputFormat.setOutputPath(job, new Path(myPath + args[0]));
job.setInputFormatClass(AvroKeyInputFormat.class);
AvroJob.setInputKeySchema(job, <schemaclass>.getClassSchema());
job.setMapperClass(<classname>Mapper.class);
job.setNumReduceTasks(0);
job.setOutputKeyClass(Map.class);
job.setOutputValueClass(Text.class);
return (job.waitForCompletion(true) ? 0 : 1);
现在我的输出看起来像这样:
{key11=key12} text1
{key21=key22} text2
{key31=key32} text3
{key41=key42} text4
我需要做什么才能使输出看起来像:
key11|key12|text1
key21|key22|text2
key31|key32|text3
key41|key42|text4
谢谢!
既然它是一个仅限Map的作业,为什么不将输出写成:
context.write(myKey, NullWritable.get());
使用键作为两个键的连接,并使用|分隔值
可以使用NullWritable作为键,Text作为值。在Text中,可以用任意分隔符分隔三个元素。