2013-05-08 2 views
0

В моем исходном файле у меня есть столбец как страна. Теперь моя задача - разместить записи определенной страны в отдельный файл, назвав его в этой стране. Возможно ли это сделать в Map-reduce.! Пожалуйста, поделитесь своими идеями относительно этого.Возможно ли иметь несколько выходных файлов для уменьшения карты?

+0

Вы пробовали 'тройник' клонировать выходной поток. – Marichyasana

+0

No @Marichyasana На самом деле, я не знаю об этом. Можете ли вы разработать –

+0

. Какую версию hadoop вы используете, и вы ищете старый API ('mapred') или новый API (' mapreduce') на основе? –

ответ

3

Да, в hadoop вы можете использовать MultipleOutputFormat, чтобы сделать именно это, используя его метод generateFileNameForKeyValue.

Использование названий вашей страны в качестве ключей и записей в качестве значений должно работать именно так, как вам нужно.

3

Если вы используете новый API, вы должны изучить класс MultipleOutputs. В этом классе есть пример.

шаблон Использование для представления работы:

 



    Job job = new Job(); 

    FileInputFormat.setInputPath(job, inDir); 
    FileOutputFormat.setOutputPath(job, outDir); 

    job.setMapperClass(MOMap.class); 
    job.setReducerClass(MOReduce.class); 
    ... 

    // Defines additional single text based output 'text' for the job 
    MultipleOutputs.addNamedOutput(job, "text", TextOutputFormat.class, 
    LongWritable.class, Text.class); 

    // Defines additional sequence-file based output 'sequence' for the job 
    MultipleOutputs.addNamedOutput(job, "seq", 
     SequenceFileOutputFormat.class, 
     LongWritable.class, Text.class); 
    ... 

    job.waitForCompletion(true); 
    ... 

Использование в Reducer:

 


    String generateFileName(K k, V v) { 
     return k.toString() + "_" + v.toString(); 
    } 

    public class MOReduce extends 
     Reducer { 
     private MultipleOutputs mos; 
     public void setup(Context context) { 
      ... 
       mos = new MultipleOutputs(context); 
      } 

     public void reduce(WritableComparable key, Iterator values, 
       Context context) 
       throws IOException { 
      ... 
    mos.write("text", , key, new Text("Hello")); 
    mos.write("seq", LongWritable(1), new Text("Bye"), "seq_a"); 
    mos.write("seq", LongWritable(2), key, new Text("Chau"), "seq_b"); 
    mos.write(key, new Text("value"), generateFileName(key, new Text("value"))); 
    ... 
     } 

    public void cleanup(Context) throws IOException { 
     mos.close(); 
    ... 
    } 
    } 

+4

Упомяните, пожалуйста, код выше? У каждого есть доступ к документации на акции. Люди приходят сюда для объяснений. –

Смежные вопросы