2016-04-28 11 views
0

私の仕事に複数の入力パスがあります。例:ブロックがHadoopのどのファイルパスに属しているかを確認します。

//Driver.class 
     for (String s : listFile) { 
      MultipleInputs.addInputPath(job, new Path(s), SequenceFileInputFormat.class);// ex: /home/path1, /home/path2, ... 
     } 
     ..... 
    //Mapper.class 
     public void map(Text key, Data bytes, Context context) throws IOException, InterruptedException { 
       ..... 
      } 

私の質問それはマップ()関数の中で、現在のペア(キー、値)を決定するためにどのような方法がありますさにどのファイル属していますか?

+0

'(JobConf)'メソッドの 'JobConf'からファイルパスを抽出することができます。 javadocs:https://hadoop.apache.org/docs/r2.6.3/api/org/apache/hadoop/mapred/Mapper.htmlの例を参照してください。 – gudok

答えて

0

あなたInputFormatとしてSequenceFileInputFormatを使用しているので、SequenceFileInputFormatはそのRecordReaderとしてSequenceFileRecordReader使用し、その方法Pathを所有しているFileSplitを返しgetSplits()、そしてもちろんSequenceFileRecordReaderPathを得ることができますFileInputFormatを拡張します。だからあなたがする必要があるのは、keyvalueを受け取ったときにそのうちの1つにPathが含まれていることです。これはRecordReaderで行う必要があります。ここで

は、手順は次のとおりです。カスタムInputFormatクラスはSequenceFileInputFormatを拡張してください、とオーバーライド

class YourValClass implements Writable { 
    Writable value; // your orginal value 
    Path path; // the path you want 
} 
    • original valuepathを含むカスタムvalClassを作りますcreateRecordReader()カスタムに戻る方法RecordReader

      class YourInputputFormat extends SequenceFileInputFormat<YourKeyClass, YourValClass> { 
      
          @Override 
          public RecordReader<YourKeyClass, YourValClass> createRecordReader(InputSplit split, TaskAttemptContext context) throws IOException { 
           return new YourRecordReader(); // return your custom RecordReader 
          } 
      } 
      
    • あなたが一緒にあなたのvaluepathを組み合わせることが可能なカスタムRecordReaderを行います

      class YourRecordReader extends SequenceFileRecordReader<YourKeyClass, YourValClass> { 
          Path path; 
      
          @Override 
          public void initialize(InputSplit inputSplit, TaskAttemptContext taskAttemptContext) throws IOException, InterruptedException { 
           super.initialize(inputSplit, taskAttemptContext); 
           FileSplit fileSplit = (FileSplit) inputSplit; 
           this.path = fileSplit.getPath(); // assign the path 
          } 
      
          @Override 
          public YourValClass getCurrentValue() { 
           YourValClass val = super.getCurrentValue(); 
           if (null != val) { 
            val.path = path; // set the path 
           } 
           return val; 
          } 
      } 
      

    今、あなたはYourValClass値からpathを得ることができます。

  • 関連する問題