5

私は、hadoopでさらにマッピングするために、削減されたデータを使用する方法を見つけようと何日も探していました。A入力データとしてクラスのオブジェクトがあり、出力データとしてクラスのオブジェクトがありますB。問題は、マッピング中にBsが生成されるだけでなく、新しいAsも生成されることです。

これが私が達成したいことです:

1.1 input: a list of As
1.2 map result: for each A a list of new As and a list of Bs is generated
1.3 reduce: filtered Bs are saved as output, filtered As are added to the map jobs

2.1 input: a list of As produced by the first map/reduce
2.2 map result: for each A a list of new As and a list of Bs is generated
2.3 ...

3.1 ...

あなたは基本的な考えを得る必要があります。

チェーンについてはたくさん読んだことがありますが、ChainReducerとChainMapperを組み合わせる方法や、これが正しいアプローチであるかどうかはわかりません。

だからここに私の質問があります:出力として一方の部分を保存し、新しい入力データとしてもう一方の部分を保存するために縮小しながら、マップされたデータを分割するにはどうすればよいですか?

4

1 に答える 1

2

MultipleOutputsを使用してみてください。Javadocが示唆しているように:

MultipleOutputsクラスは、複数の出力への出力データの書き込みを簡素化します

ケース1:ジョブのデフォルト出力以外の追加出力への書き込み。追加の各出力、または名前付き出力は、独自のOutputFormat、独自のキークラス、および独自の値クラスで構成できます。

ケース2:ユーザーが提供したさまざまなファイルにデータを書き込む

ジョブ送信の使用パターン:

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);
 ...

レデューサーでの使用法:

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

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

 public void reduce(WritableComparable key, Iterator<Writable> 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();
 ...
 }

 }
于 2013-01-13T18:48:47.213 に答える