MongoDBのMap/Reduce
これまでにAggregationフレームワークで実行した集計を,
Map関数の準備
Map関数は,
keyにはグルーピングするキーを指定します。先ほどと同様に,
Map関数内部でkeyとvalueを作成するために,
> map = function() { emit(this.url_path, {count: 1}); }
Reduce関数の準備
Reduce関数には,
> reduce = function(key, values) { var count = 0; values.forEach(function(v) { count += v['count']; }); return {count: count}; }
Map/Reduceで集計する
Map関数とReduce関数が作成できたら,
それでは,
> db.httplogs.mapReduce( map, reduce, {out: {inline:1}} ); { "results" : [ { "_id" : "/", "value" : { "count" : 4 } }, { "_id" : "/top", "value" : { "count" : 3 } }, { "_id" : "/user", "value" : { "count" : 3 } } ], "timeMillis" : 1, "counts" : { "input" : 10, "emit" : 10, "reduce" : 3, "output" : 3 }, "ok" : 1, }
URLアクセス数の合計が,
次はURLとHTTPステータスコードの2つをキーとして集計してみましょう。
- ※)
- オプションでは,
結果を保存するコレクションの指定や, 最後に実施するfinalize関数の指定が可能です。詳細は公式マニュアルを参照ください。
複数キーで集計する
複数キーで集計するためには,
URLとHTTPステータスコードをキーとするために,
> map = function() { emit({url_path: this.url_path, status: this.status}, {count: 1}); }
Reduce関数は先ほどのままで良いので,
> db.httplogs.mapReduce( map, reduce, {out: {inline:1}} ); { "results" : [ { "_id" : { "url_path" : "/", "status" : "200" }, "value" : { "count" : 2 } }, { "_id" : { "url_path" : "/", "status" : "500" }, "value" : { "count" : 2 } }, ...
URLとHTTPステータスコードが集計のキーとなっていることが確認できました。
Map/Reduceでできること
Map/
それでは最後に,
その他集計処理ミドル(Hadoop)との連携
Hadoopと組み合わせて使う
Hadoopは,
公式マニュアルも充実しており,
MongoDBとHadoopを組み合わせて使用することによって,
今回の記事では,
まとめと次回のテーマ
今回はMongoDBで集計を実施する方法を紹介しました。MongoDBには,
また,
次回はMongoDBの運用について紹介する予定です。お楽しみに!