パケット集約パーティション - 1.1.1エンド接続を減らします
低減接続端子が同じパーティションに割り当てられた分割機能を低下させるために利用される気象データと同一の温度が設定にデータを記録stationid、パケットが凝集を減少させる用い、同じstationid、機能が低下読み出し最初のレコード(つまり、気象観測所名で)接続、組み合わせ出力した後、他のレコードをグループ化。ステーションは、例えば次のデータセット及び温度データセットを記録するために、接続されています。まずそれは、確かに多くのこの実際のデータよりも、いくつかのデータ分析ショーで行います。
気象データセット、および気象観測所名データテーブルID
StationId StationName
1〜杭州
2〜上海
3〜北京
録音温度データセット
StationIdタイムスタンプ温度
3〜20200216〜6
3〜20200215〜2
3〜20200217〜8
1〜20200211〜9
1〜20200210〜8
2〜20200214〜3
2〜20200215〜4
目的:上記二つのデータセットは、天候温度の名前は、ほとんどの天候IDとして出力する記録ステーションを追加され、接続されます。
1〜杭州〜20200211〜9
1〜杭州〜20200210〜8
2〜上海〜20200214〜3
2〜上海〜20200215〜4
3〜北京〜20200216〜6
3〜北京〜20200215〜2
3〜北京〜20200217〜8
次のように詳細手順は、
(1) 2 maperがドキュメントを持つ2つのデータセットに読み出したデータを出力します
使用MultipleInputsは、2つのファイルパス、2マッパーを提供して異なるデータ形式ので、読み取られた2つの異なるmaper、同一のファイルに出力を作成する必要があります。
(2) キーの組み合わせを作成<駐留、マーク> 使用マップは、出力をソート。
出力マップstationIDが昇順に配列されたように、キーの組み合わせは、stationid第2のフィールドは、同じ順序で配置されています。、気象データを読み込み、マーク0、データセットを読み込む温度を記録したマークデータは1であるだけで2つの値をマークします。同じ記録が最初に名前をstationidというこの性を保証は、天候、残りのレコードデータの温度です。次のようにTextPairキーの組み合わせが定義されています
パッケージ温度;
輸入org.apache.hadoop.io.Text;
輸入org.apache.hadoop.io.WritableComparable;
輸入java.io.DataInput;
輸入java.io.DataOutput;
インポートにjava.io.IOException;
パブリッククラスTextPair実装WritableComparable <TextPair> {
プライベートテキスト最初。
プライベートテキスト秒。
公共TextPair(本文第一、第二テキスト){
this.first =最初;
this.second =秒;
}
公共のintのcompareTo(TextPair 0){
int型CMP = first.compareTo(o.getFirst())。
(!CMP = 0)//第一字段不同按第一字段升序排列場合
{
戻りCMP;
}
///第一字段相同、按照第二字段升序排列
戻りsecond.compareTo(o.getSecond())。
}
公共ボイドライト(DataOutput内データ出力)は、IOExceptionが{スロー
first.write(データ出力)を、
(データ出力)second.write。
}
公共ボイドreadFields(DataInput内データ入力)はスローのIOException {
first.readFields(データ入力)。
second.readFields(データ入力)。
}
公開テキストgetFirstと(){
第返します。
}
公共ボイドsetFirst(最初のテキスト){
this.first =最初;
}
公開テキストgetSecondは(){
第返します。
}
公共ボイドsetSecond(テキスト秒){
this.second =秒;
}
}
Maper出力結果は、値が続く、キーの組み合わせの前に、以下に定義されます。
<1,0>杭州
<1,1> 20200211〜9
<1,1> 20200210〜8
<2,0>上海
<2,1> 20200214〜3
<2,1> 20200215〜4
<3,0>北京
<3,1> 20200216〜6
<3,1> 20200215〜2
<3,1> 20200217〜8
(3)地図は、着信結果減らすプレスstationid パーティション重合再編を
地図出力結果は、最初のキー・フィールドの組み合わせstationidの昇順に従って昇順データを記録し、気象データ、次いで混合一緒に、shulfeプロセスは、地図データを低減する第2のフィールドに同じstationid記録が通過しますパーティションパーティションは、同じデータが同じを削減するために割り当てられますstationid、中に同じデータがstationidがグループ化されてい減らします。二つの作業を減らすと仮定すると、stationid%2によれば、結果はパーティションで仕切ら
ゾーン1
<1,0>杭州
<1,1> 20200211〜9
<1,1> 20200210〜8
<3,0>北京
<3,1> 20200216〜6
<3,1> 20200215〜2
<3,1> 20200217〜8
ディビジョン2
<2,0>上海
<2,1> 20200214〜3
<2,1> 20200215〜4
(4 )次いで、各パーティションのデータと後のパーティションによるstationid パケットアグリゲーション
ゾーン1
ヒート1
<1,0> <杭州、〜9 20200211、20200210〜8 >
ヒート2
<3,0> <北京、〜6 20200216〜20200215 2、20200217〜8 >
パーティション2
<2,0> <上海、〜3 20200214、20200215〜4 >
(5 )入力データパケット集約を減らす機能は、記録ステーションの温度は、後者の出力に加算されます。
データは、マークの後の昇順に配置されているので、第1のデータ気象局名データの各々、及び残りは気象データ記録の温度変化であることは、第一の天気マークデータフィールドの効果を確実にすることです。そのため、それぞれが第一の値は、両方の気象局名をお読みください。出力値の他の組み合わせ、すなわち、接続データセットを達成します。
1〜杭州〜20200211〜9
1〜杭州〜20200210〜8
2〜上海〜20200214〜3
2〜上海〜20200215〜4
3〜北京〜20200216〜6
3〜北京〜20200215〜2
3〜北京〜20200217〜8
(6 )詳細なコード例
パッケージ温度;
輸入org.apache.hadoop.conf.Configuration。
輸入org.apache.hadoop.conf.Configured;
輸入org.apache.hadoop.fs.Path。
輸入org.apache.hadoop.io *。;
輸入org.apache.hadoop.mapreduce *。;
輸入org.apache.hadoop.mapreduce.lib.input.FileInputFormat。
輸入org.apache.hadoop.mapreduce.lib.input.MultipleInputs。
輸入org.apache.hadoop.mapreduce.lib.input.TextInputFormat。
輸入org.apache.hadoop.mapreduce.lib.output.FileOutputFormat。
輸入org.apache.hadoop.util.Tool;
輸入org.apache.hadoop.util.ToolRunner;
インポートにjava.io.IOException;
インポートするjava.util.Iterator;
JoinRecordWithStationId拡張設定済みの実装クラスのパブリックツール{
//天気処理クラスのデータ・セット名
マッパー<LongWritableは、テキストは、TextPair、テキスト> {延びているのpublic staticクラスStationMapper
保護のボイドマップ(テキストキー、テキスト値、コンテキストコンテキスト)はIOExceptionがスローされます、 {InterruptedExceptionある
。//杭州1〜
文字列[] =値()スプリット( "〜");. value.toString
IF(values.length = 2!)
{
リターン;
}
//キーの組み合わせ最初のフィールドstationidを、第二0デフォルトのフィールドは、局名データを示している
context.write(新しい新しいTextPair(新しい新しいテキスト(値[0])、テキストは、新しい新しい(「0」))、テキスト新しい新しい(値)[1]);
}
}
//サーモグラフィマッパークラスのデータセットを処理
静的クラスTemperatureRecordMapperマッパー公共<LongWritable、テキスト、TextPair、テキスト> {拡張
保護地図のボイド(TextPairキー、テキスト値、コンテキストコンテキストは)にIOException、InterruptedExceptionあるが{スロー
)文字列[] =(値をvalue.toString。スプリット( "〜" );
!IF(= values.length 3)。
{
リターン;
}
//キーの組み合わせは、最初のフィールドをstationID、第2のフィールドは、デフォルトで、記録データが温度を示している
。// 20200216を3〜6
列= OutputValue値[1] + "〜" +値[2];
context.write(新しい新しいTextPair(新しい新しいテキスト(値[0])、テキスト新しい新規(」1" ))、テキスト新しい新しい(OutputValue));
}
}
//パーティションによるstatitionid partionerクラス
静的クラスFirstPartitioner拡張パーティション分割の公共<TextPair、テキスト> {
公共のint getPartition(TextPair textPair、テキスト、テキスト、int型I){
//は、パーティションID与えるために、最初のフィールドのstationidのタスクの数を減らし、残りを取る
リターン整数。のparseInt(textPair.getFirst ().toString())%のI;
}
}
//比較パケットクラス
のパブリック静的クラスGroupingComparator延びWritableComparator
{
公共のint比較(WritableComparable A、B WritableComparable){
TextPair Pairal =(TextPair)A;
TextPair pairB =(TextPair)B ;
戻り値のセットに0であり、// stationid同一
のcompareTo(pairB.getFirst());.)リターンpairA.getFirst(
}
}
最初のデータ値にキーデータの後// reudceパケット(ステーション名)、重合温度は、ファイルへの値の後ろに記録されている
パブリック静的クラスJoinReducer減速<TextPair、テキスト、テキスト、テキスト>延び
{
@オーバーライド
ボイド保護減らす(TextPairキー、反復処理可能<テキスト>値は、コンテキストコンテキスト)にIOException、InterruptedExceptionある{スロー
イテレータをvalues.iterator ITは、()=;
列StationName = it.next()のtoString();.
一方(it.hasNext( ))
{
文字列OutputValue = "〜" + StationName + "〜" + it.toString();
context.write(key.getFirst()、テキスト新しい新しい(OutputValue));
}
}
}
公共int型の実行(String []型引数)はIOExceptionが、ClassNotFoundExceptionが、InterruptedExceptionある{スロー
するif(!args.length = 3)
{
リターンを-1;
}
求人=新しい仕事(getConf()、 "joinStationTemperatueRecord");
IF(ジョブ== NULL)
{
リターン-1。
}
job.setJarByClass(this.getClass())。
//设置两个输入路径、一个输出路径
パスStationPath =新しいパス(引数[0])。
パスTemperatureRecordPathは、新しいパス(引数[1])=。
パスoutputPath =新しいパス(引数[2])。
MultipleInputs。addInputPath(ジョブ、StationPath、TextInputFormat.class、StationMapper.class)。
MultipleInputs。addInputPath(ジョブ、TemperatureRecordPath、TextInputFormat.class、TemperatureRecordMapper.class)。
FileOutputFormat。setOutputPath(ジョブ、outputPath)。
//设置分区类、分组类、类減らす
job.setPartitionerClass(FirstPartitioner.class)。
job.setGroupingComparatorClass(GroupingComparator.class)。
job.setReducerClass(JoinReducer.class)。
//设置输出类型
job.setOutputKeyClass(Text.class)。
job.setOutputValueClass(Text.class)。
job.setMapOutputKeyClass(TextPair.class)。
job.setMapOutputValueClass(Text.class)。
リターンjob.waitForCompletion(本当)?0:1。
}
静的な無効メインパブリック(文字列[]引数)は例外スロー
{
セットは、データパス、2つのパラメータを乗り切る:データ・セットのレコードのパスの温度を、3つのパラメータ:出力パス// 3つのパラメータを、一つのパラメータ
。INT = ToolRunnerザEXITCODE RUN(新しい新JoinRecordWithStationId()、引数)
。システム出口(EXITCODE);
}
}
ミッションコマンド
%のHadoopのジャー温度example.jar JoinRecordWithStationId入力/ステーション/全ての入力/ NCDC /全出力
ご自身が、あなたが取得するために、下のリンクをクリックする必要があり、非常に強力な、インテリジェント株式解析ソフトウェアを開発しました: