私は最近、Hadoop関連の本を読んでいます。私はそのように少し感じているので、WordCountプログラムを模倣することで統計的に関連する製品を書きました。
要件の説明:
スーパーマーケットの販売リストによると、商品間の相関度(つまり、商品Aと商品Bを購入する回数を同時に数えます)を計算します。
データ形式:
スーパーマーケットの販売リストは、次の形式に簡素化されます。行はリストを表し、各製品は「」に分割されます。
要件分析:
HadoopでMapReduceを使用して、この要件を計算します。
マップ関数は主に関連製品を分割し、出力の結果はキーが製品Aであり、値は製品Bであることです。最初の結果と3つの結果の分割結果を次の図に示します。
2つの商品AとBに関連付けられたい製品をカウントするために、商品AとB間の関係は、ABとBA、つまりABとBAの2つの結果を出力します。
製品Aに関連する製品をグループ化してカウントした還元機能、つまり、各製品が値に表示される回数を計算し、出力の結果はキーが製品A |製品Bであり、値はこの組み合わせが発生する回数です。上記の5つのレコードについては、マップ出力のRのキー値を分析します。
マップ関数の処理を通じて、下の図に示されているレコードが取得されます。
Reduceの値の値出力はグループ化およびカウントされ、結果は下の図に示されています。
製品ABをキーとして使用し、製品の数を出力の価値として組み合わせて、出力の結果を以下の図に示します。
要件の実装プロセスの分析はこれまでに終了しました。以下の特定のコード実装を見てみましょう。
コード実装:
コードの詳細な紹介はしません。詳細については、コードのコメントを参照してください。
パッケージcom; java.io.ioexceptionをインポートします。 java.util.hashmapをインポートします。 java.util.map.entryをインポートします。 Import org.apache.hadoop.conf.configuration; import org.apache.hadoop.conf.configured; Import org.apache.hadoop.fs.path; org.apache.hadoop.io.intwritableをインポートします。 org.apache.hadoop.io.longwritableをインポートします。 org.apache.hadoop.io.textをインポートします。 org.apache.hadoop.mapreduce.jobをインポートします。 org.apache.hadoop.mapreduce.mapperをインポートします。 Import org.apache.hadoop.mapreduce.ducer; import org.apache.hadoop.mapreduce.lib.input.fileinputformat; import org.apache.hadoop.mapreduce.lib.output.fileoutputformat; import org.apache.hadoop.mapreduce.lib.output.textoutputformat; import org.apache.hadoop.util.tool; org.apache.hadoop.util.toolrunnerをインポートします。パブリッククラステストは構成された実装拡張ツール{ / ** *マップクラス、データプリプロセシング *を実装します *出力結果キーは製品b * @author lulei * / public static class maptはマッパー<longwritable、テキスト、テキスト、テキスト> if(!(line == null || "" .equals(line)){//製品文字列[] = line.split( "、"); // 2つを組み合わせて(int i = 0; i <(vs.lent -length -1); i ++){if( "" "。 vs. j ++){""。出力結果キーは製品A | b値です。これは、関連性の数です= integer.parseint(countStr); hashmap <string、integer> hashmap = new hashmap <string、integer>(); //ハッシュを使用して、(テキスト値:値)の時間b製品の数をカウントします{string valueStr = value.toString(); if(hashmap.containskey(valueStr)){hashmap.put(valuester、hashmap.get(valuest) + 1); } else {hashmap.put(valuestr、1); }} //(entry <string、integer> entry:hashmap.entryset())の結果を出力{if(entry.getValue()> = this.count){//出力context.write(keystr + "|" + entry.getkey()、new intwritable(entry.getValue()); }}}} @Override public int run(string [] arg0)スロー例外{// dodo auto-eneratedメソッドスタブ構成conf = getConf(); conf.set( "count"、arg0 [2]);ジョブジョブ=新しいジョブ(conf); job.setjobname( "jobtest"); job.setOutputformatclass(textOutputformat.class); job.setOutputKeyclass(text.class); job.setOutputValueClass(text.class); job.setmapperclass(mapt.class); job.setReducerclass(reducet.class); fileInputformat.addinputpath(job、new Path(arg0 [0])); fileoutputformat.setOutputPath(job、new Path(arg0 [1])); job.waitforcompletion(true); job.issucsful()を返しますか? 0:1; } / ** * @param args * / public static void main(string [] args){// todo auto-fenatedメソッドスタブif(args.length!= 3){system.exit(-1); } try {int res = toolrunner.run(new configuration()、new test()、args); system.exit(res); } catch(例外e){// todo auto-enerated catch block e.printstacktrace(); }}}アップロードと実行:
プログラムをJARファイルにパッケージ化し、マシングループにアップロードします。テストデータをHDFS分散ファイルシステムにアップロードします。
コマンドの実行のスクリーンショットを次の図に示します。
実行が完了したら、下の図に示すように、対応するHDFSファイルシステムを確認してください。
これが完全なMapReduceプログラムです。私はHadoopについて学び続けます〜読んでくれてありがとう、私はそれがあなたを助けることができることを願っています。このサイトへのご支援ありがとうございます!