2014-05-23 50 views
0

我正在編寫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 

謝謝!

回答

2

既然是唯一的地圖的工作,爲什麼不寫輸出爲:

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

隨着關鍵的2個鍵的級聯和分隔值|。

+1

NullWritable是一個單例。你不能創建它的新實例。而是使用NullWritable.get()。 –

+0

謝謝。立場糾正。 – Venkat

1

您可以使用NullWritable作爲鍵和Text作爲值。在文本中,您可以將三個元素用您喜歡的任何分隔符分隔。