第3節のMapReduce高度:7、カスタムOUTPUTFORMAT以下の別のフォルダに出力を達成

2.1要件

データフィールドは第九の賞賛を表し、最終的なデータ、データ内容の参照設定]フォルダに下記の別のフォルダへの個別審査データのニーズ、称賛と悪い注文が分かれているいくつかの受注があり、 、普通、悪いです。0:、良い1:2の平均:悪いです

次のようなデータ内容:

私は\ N 1 3ハローが来て戻ってきたいと思い12018-03-15夜09時29分06秒2018年3月15日夜09時29分06秒と、それ02018-03-14 22時29分03秒
22018-03- 15 22時42分08秒2018年3月15日22時42分08秒良いの\のN 1 1のが行くと02018-03-14午前22時42分04秒を歩いてみましょうと言う権利を追加します。

2.2分析

プログラムのキーポイントは、フレキシブル出力要求がカスタムOUTPUTFORMATによって達成することができ、別のディレクトリにデータを結果出力の異なるタイプに基づいて、プログラム内のMapReduceします

2.3を実現します

実現のポイント:

1、MapReduceの外部リソースへのアクセス

recordwriterは、特定の出力データの書き込みを書き換え、書き換えする方法2、カスタムOUTPUTFORMAT、()

 

 コード:

MyOutputFormatMain:
パッケージcn.itcast.demo4.outputformat。

輸入org.apache.hadoop.conf.Configuration。
輸入org.apache.hadoop.conf.Configured;
輸入org.apache.hadoop.fs.Path。
輸入org.apache.hadoop.io.LongWritable;
輸入org.apache.hadoop.io.NullWritable;
輸入org.apache.hadoop.io.Text;
輸入org.apache.hadoop.mapreduce.Job。
輸入org.apache.hadoop.mapreduce.lib.input.TextInputFormat。
輸入org.apache.hadoop.mapreduce.lib.output.TextOutputFormat。
輸入org.apache.hadoop.util.Tool。
輸入org.apache.hadoop.util.ToolRunner。

パブリッククラスMyOutputFormatMainが設定さツール{実装延び
@Override
公共int型のラン(文字列[]引数)が{例外をスロー

ジョブジョブ= Job.getInstance(this.getConf()、MyOutputFormatMain.class.getSimpleName());
// job.setJarByClass(MyInputFormatMain.class)。
job.setInputFormatClass(TextInputFormat.class)。
TextInputFormat.addInputPath(仕事、新しいパス( "ファイル:/// D:\\ \\研究BigData \\ heima \\ STAGE2 \\ 5、大数据离线第五天\\自定义OUTPUTFORMAT \\入力")) ;

job.setMapperClass(MyOutputFormatMapper.class)。
job.setMapOutputKeyClass(Text.class)。
job.setMapOutputValueClass(NullWritable.class)。

job.setOutputFormatClass(MyOutputFormat.class)。
TextOutputFormat.setOutputPath(仕事、新しいパス( "ファイル:/// D:\\ \\研究BigData \\ heima \\ STAGE2 \\ 5、大数据离线第五天\\自定义OUTPUTFORMAT \\出力")) ;

ブールB = job.waitForCompletion(TRUE)。
リターンB 0:1;
}

パブリック静的無効メイン(文字列[] args){例外をスロー
= ToolRunner.run(新しい構成()、新しいMyOutputFormatMain()、引数)を実行int型。
でSystem.exit(実行)。
}
}


MyOutputFormatMapper:
パッケージcn.itcast.demo4.outputformat。

輸入org.apache.hadoop.io.LongWritable;
輸入org.apache.hadoop.io.NullWritable;
輸入org.apache.hadoop.io.Text;
輸入org.apache.hadoop.mapreduce.Mapper;
輸入org.apache.hadoop.mapreduce.lib.input.FileSplit;

インポートにjava.io.IOException;

パブリッククラスMyOutputFormatMapperはマッパー<LongWritable、テキスト、テキスト、NullWritable> {延び
@Overrideは
ボイドマップを保護(LongWritableキー、テキスト値、コンテキストコンテキストは)にIOException、InterruptedExceptionある{スロー
context.write(値、NullWritable.getを())。
}
}

MyOutputFormat:
パッケージcn.itcast.demo4.outputformat。

輸入org.apache.hadoop.conf.Configuration。
輸入org.apache.hadoop.fs.FSDataOutputStream。
輸入org.apache.hadoop.fs.FileSystem;
輸入org.apache.hadoop.fs.Path。
輸入org.apache.hadoop.io.NullWritable;
輸入org.apache.hadoop.io.Text;
輸入org.apache.hadoop.mapreduce.RecordWriter。
輸入org.apache.hadoop.mapreduce.TaskAttemptContext;
輸入org.apache.hadoop.mapreduce.lib.output.FileOutputFormat。

インポートにjava.io.IOException;

パブリッククラスMyOutputFormatはFileOutputFormat <テキスト、NullWritable> {拡張

@Overrideを
RecordWriter公共<テキスト、NullWritable> getRecordWriter(TaskAttemptContextコンテキスト)はIOExceptionが、InterruptedExceptionある{スロー
設定context.getConfiguration CONF =();
ファイルシステムファイルシステム= FileSystem.get(CONF);
FSDataOutputStream goodComment = fileSystem.create(新新パス(「ファイル:/ // D:\\研究\\ BigData \\ heima \\ STAGE2 \\ 5、 大きなデータの第五日オフラインgoodComment \\ \\ \\カスタムgoodComment.txt OUTPUTFORMAT「));

FSDataOutputStream badComment fileSystem.create(=新しいパス( "ファイル:/// D :\\ \\研究BigData \\ heima \\ STAGE2 \\ 5、 \\ badComment \\ badComment.txt OUTPUTFORMAT五日オフ、大規模なデータ\\カスタム")) ;

=新しい新しいmyRecordWriter myRecordWriter myRecordWriter(goodComment、badCommentに);
myRecordWriterを返します;
}
}

MyRecordWriter:
cn.itcast.demo4.outputformatパッケージ; 

インポートorg.apache.commons.io.IOUtils;
インポートorg.apache.hadoop.fs.FSDataOutputStream;
インポートorg.apache.hadoop.io.NullWritable;
インポートorg.apache.hadoop.io .text;
インポートorg.apache.hadoop.mapreduce.RecordWriter;
インポートorg.apache.hadoop.mapreduce.TaskAttemptContext、

インポートにjava.io.IOException;

publicクラスRecordWriter <テキスト、NullWritable> {延びMyRecordWriter
//我々は2つの出力を定義しますストリーム出力は、以下の別のフォルダに移動するようにされ
、プライベートFSDataOutputStream goodStream
プライベートFSDataOutputStream badStream;

公共MyRecordWriter(FSDataOutputStream goodStream、FSDataOutputStream badStream){
this.goodStream = goodStream。
= badStream this.badStream;
}

/ **
*私たちは、データ書き出します
我々はコメントデータのライン持っている*の@paramのテキストを
* @param nullWritableを
*は、IOExceptionを@throws
* @throws InterruptedExceptionある
* /
@Override
書き込み(テキスト、テキスト、NullWritable公共ボイドnullWritable)はIOExceptionが、InterruptedExceptionある{スロー
// 1 2018年3月15日22時29分06秒2018年3月15日22時29分06秒私は来る1 3ハロー\ Nを戻ってきたいと思い、それ02018-03-1422を:29:03
文字[] = text.toStringスプリット()スプリット( "\ T");.
整数Integer.parseInt commentStatus =(スプリット[9])

IF(commentStatus <= 1){//良い0、データは1つのコメント
アウトデータを書き出すために、//出力ストリームを
goodStream.write(text.toString()GetBytesメソッド()。)。
goodStream.write( "\ R \ n"は.getBytes()); //换行
}他{//差评2数据
badStream.write(text.toString()GetBytesメソッド()。)。
badStream.write( "\ R \ n"は.getBytes())。
}

}

@Override
公共ボイド近い(TaskAttemptContextコンテキスト)にIOException、InterruptedExceptionある{スロー
IOUtils.closeQuietly(goodStream)を、
IOUtils.closeQuietly(badStream)。
}
}

おすすめ

転載: www.cnblogs.com/mediocreWorld/p/11041026.html