-1

Hadoop と MapReduce は初めてで、キーに基づいて複数のファイルに出力を書き込もうとしています。誰かがそれを使用する方法について明確なアイデアまたはJavaコードスニペットの例を提供してください。私のマッパーは正確に機能しており、シャッフルの後、キーと対応する値が期待どおりに取得されます。ありがとう!

私がやろうとしているのは、入力ファイルから新しいファイルにいくつかのレコードのみを出力することです。したがって、新しい出力ファイルには、残りの無関係なレコードを無視して、必要なレコードのみが含まれます。MultipleTextOutputFormat を使用しなくても、これは正常に機能します。マッパーに実装したロジックは次のとおりです。

 public static class MapClass extends
            Mapper {

StringBuilder emitValue = null; StringBuilder emitKey = null; Text kword = new Text(); Text vword = new Text(); public void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException { String[] parts; String line = value.toString(); parts = line.split(" "); kword.set(parts[4].toString()); vword.set(line.toString()); context.write(kword, vword); } }

reduce への入力は次のようになります:
[key1]--> [value1, value2, ...]
[key2]--> [value1, value2, ...]
[key3]--> [value1, value2, .. .] など、
私の関心は [key2]--> [value1, value2, ...] であり、他のキーと対応する値は無視されます。減速機で私を助けてください。

4

1 に答える 1

1

を使用MultipleOutputsすると、レコードを複数のファイルに出力できますが、事前に定義された数/タイプのファイルのセットのみであり、任意の数のファイルではなく、キー/値に応じてファイル名をその場で決定することもできません。

を拡張して、独自の OutputFormat を作成できますorg.apache.hadoop.mapred.lib.MultipleTextOutputFormat。あなたの OutputFormat クラスは、レデューサーによって発行されたキー/値に従って、出力ファイル名とフォルダーの決定を可能にするものとします。これは次のようにして実現できます。

 package oddjob.hadoop;

 import org.apache.hadoop.fs.Path;
 import org.apache.hadoop.io.Text;
 import org.apache.hadoop.mapred.lib.MultipleTextOutputFormat;

 public class MultipleTextOutputFormatByKey extends MultipleTextOutputFormat<Text, Text> {

        /**
        * Use they key as part of the path for the final output file.
        */
       @Override
       protected String generateFileNameForKeyValue(Text key, Text value, String leaf) {
             return new Path(key.toString(), leaf).toString();
       }

       /**
        * When actually writing the data, discard the key since it is already in
        * the file path.
        */
       @Override
       protected Text generateActualKey(Text key, Text value) {
             return null;
          }
 }

詳細については、こちらをご覧ください

PS:mapredそれを実現するには、古い API を使用する必要があります。新しい API のように、MultipleTextOutputまだサポートされていません! これを参照してください。

于 2013-03-11T18:42:08.943 に答える