我正在編寫mapreduce作業。這是一個只有地圖的工作。我的輸出鍵包含兩個元素,並且該值包含一個元素。從表格的角度來看,我希望輸出是三列,每一行都是新記錄。如果可能的話,它應該由一些特殊的字符來限定。Map Only 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
謝謝!
NullWritable是一個單例。你不能創建它的新實例。而是使用NullWritable.get()。 –
謝謝。立場糾正。 – Venkat