仅映射Mapreduce文本输出

时间:2014-05-23 16:33:14

标签: java hadoop mapreduce

我正在写一个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

谢谢!

2 个答案:

答案 0 :(得分:2)

由于它是仅限Map的作业,为什么不将输出写为:

context.write(myKey,  NullWritable.get());

将密钥作为2个密钥的串联,并将值分隔为|。

答案 1 :(得分:1)

您可以将NullWritable用作键,将Text用作值。在Text中,您可以将三个元素分隔为您喜欢的任何分隔符。