1、相続FileOutputFormat、複製方法getRecordWriter
/ ** * @description:カスタムOUTPUTFORMAT、別のファイルへの出力データ * / パブリック クラス FilterOutputFormat 拡張 FileOutputFormat <テキスト、NullWritableは> { @Override 公共 RecordWriterを<テキストは、NullWritable> getRecordWriter(TaskAttemptContext仕事を)投げるIOExceptionが、InterruptedExceptionある{ リターンを 新しい新しいFRecordWriter(仕事); } }
RecordWriterを達成するために2、
/ ** * @description:継承RecordWriter、別のディレクトリのファイルへの出力データを達成するために、 * / パブリック クラス FRecordWriter 拡張 RecordWriter <テキスト、NullWritable> { のFSDataOutputStream OUT1 = ヌル; のFSDataOutputStream OUT2 = ヌル; @Override 公共 ボイド書き込み(テキストキー、NullWritableを値)はスローにIOException、InterruptedExceptionある{ //が異なるに「百度」と「アリババ」の文字列、ファイル出力が含まれているか否かを判断する 場合(key.toString()。含み(「百度」)|| key.toStringを()。(含まれてい"アリババ" )){ out1.write(key.toString()GetBytesメソッド()); } {他 out2.write(key.toString()GetBytesメソッド()。)。 } } @Override 公共 ボイド近い(TaskAttemptContextコンテキスト)がスローにIOException、InterruptedExceptionある{ IOUtils.closeStream(OUT1)は、 IOUtils.closeStream(OUT2)。 } 公共FRecordWriter(TaskAttemptContextジョブ){ ファイルシステムFS。 試す{ パスパス1 = 新しいパス( "出力1 / a.log" ); パスパス2 = 新しいパス( "OUTPUT2 / B.LOG" ); System.out.println(path1.getName())。 System.out.println(path2.getName())。 FS = FileSystem.get(job.getConfiguration())。 OUT1 = fs.create(パス1)。 OUT2 = fs.create(パス2)。 } キャッチ(例外e){ e.printStackTrace(); } } }
3、マップ
/ ** * @description:按行读取、按行写入 * / パブリック クラス FilterMapperは延びマッパー<LongWritable、テキスト、テキスト、NullWritable> { @Overrideは、 保護された ボイドマップ(LongWritableキー、テキスト値、コンテキスト・コンテキスト)がスローIOExceptionが、InterruptedExceptionある{ context.write(値、NullWritable.get())。 } }
4、減速
パブリック クラス FilterReducer 拡張リデューサー<テキスト、NullWritable、テキスト、NullWritable> { プライベートテキストの改行= 新しい新しいテキストを(); @Overrideは、 保護された 無効削減(テキストキー、反復処理可能<NullWritable>の値は、コンテキストコンテキスト)がスローIOExceptionが、InterruptedExceptionある{ // サイクルをキー値にNULL値が除去されていない複製データを防止するためである // のIterable <NullWritable>イテレータ値、および(本実施形態では値NULL値であるが)のキー値を格納 // ループイテレータ、イテレータを介してキー値に(パブリックアドレスメモリ)連続テキストキーに引き抜くために割り当てられることになる ため(NullWritable値:値){ newLine.set(key.toString() +「\ R&LT \ N-」)。 context.write(改行値)。 } } }
5、ドライバ
/ ** * @description:カスタム出力 *サンプル、行分割文字列かどうか百度のalibabaの決定を含むことによって達成 * 1が2を含まないディレクトリに書き込ま書き込まれるディレクトリが含まれ、 * / パブリック クラスFilterDriver { 公共の 静的 ボイド(文字列引数[])主は、スロー{例外を IF(!args.length = 2 ) { System.err.println( "形式を使用して:FilterDriver <INPUTパス> <出力パス>" ); にSystem.exit( -1 ) ; } 設定CONF = 新しい新しい構成(); 求人 = Job.getInstance(CONF)。 job.setJarByClass(FilterDriver。クラス); job.setMapperClass(FilterMapper。クラス); job.setReducerClass(FilterReducer。クラス); job.setMapOutputKeyClass(テキスト。クラス); job.setMapOutputValueClass(NullWritable。クラス); job.setOutputKeyClass(テキスト。クラス); job.setOutputValueClass(NullWritable。クラス); // 要将自定义的输出格式组件设置到仕事中 job.setOutputFormatClass(。FilterOutputFormat クラス)。 FileInputFormat.setInputPaths(仕事、新しいパス(引数[0])); // 私たちはOUTPUTFORMATをカスタマイズしているが、私たちのOUTPUTFORMATがfileoutputformatから継承しているため 、// 出力とfileoutputformatの_SUCCESSファイルを、ので、これは出力ディレクトリを指定する必要があります FileOutputFormat.setOutputPath(ジョブを、新たに新しいパス(引数[1 ])); パスOUTPATH = 新しい新しいパス(引数[1。)]; ファイルシステムFS = FileSystem.get(CONF); IF (fs.exists(OUTPATH)){ fs.delete(OUTPATH、真の); } ブール結果(= job.waitForCompletion trueに) にSystem.exit(結果 0:1 ); } }