Hadoop をプレイしたことのある人は、MapReduce に精通しているはずです。MapReduce は、大きな問題を複数の小さな問題に分割し、それぞれの小さな問題を処理するためにすべてのマシンに送信できます。結果は分散コンピューティングと呼ばれる完全なソリューションに結合されます。この記事では、MongoDB での MapReduce の使用について見ていきます。 MongoDB の
mapReduce は、より複雑な集計コマンドを実装するために使用できます。MapReduce を使用すると、主に、map 関数とreduce 関数の 2 つの関数が実装されます。map 関数は、キーと値のペアのシーケンスを生成するために使用されます。 map 関数の結果reduce 関数のパラメータとして、reduce 関数内でさらなる統計が行われます。たとえば、私のデータセットは次のとおりです。
{"_id" : ObjectId("59fa71d71fd59c3b2cd908d7"),"name" : "鲁迅","book" : "呐喊","price" : 38.0,"publisher" : "人民文学出版社"} {"_id" : ObjectId("59fa71d71fd59c3b2cd908d8"),"name" : "曹雪芹","book" : "红楼梦","price" : 22.0,"publisher" : "人民文学出版社"} {"_id" : ObjectId("59fa71d71fd59c3b2cd908d9"),"name" : "钱钟书","book" : "宋诗选注","price" : 99.0,"publisher" : "人民文学出版社"} {"_id" : ObjectId("59fa71d71fd59c3b2cd908da"),"name" : "钱钟书","book" : "谈艺录","price" : 66.0,"publisher" : "三联书店"} {"_id" : ObjectId("59fa71d71fd59c3b2cd908db"),"name" : "鲁迅","book" : "彷徨","price" : 55.0,"publisher" : "花城出版社"}
var map=function(){emit(this.name,this.price)} var reduce=function(key,value){return Array.sum(value)} var options={out:"totalPrice"} db.sang_books.mapReduce(map,reduce,options); db.totalPrice.find()
emit関数は主に使用されます。グループ化を実装するには、最初のパラメータはグループ化フィールドを表し、2番目のパラメータはカウントされるデータを表します。ここで、Array の sum 関数を使用して、結果を出力するコレクションを定義します。デフォルトでは、このコレクションはデータベースの再起動後も処理され、コレクション内のデータが保持されます。クエリ結果は次のとおりです。
{ "_id" : "曹雪芹", "value" : 22.0 } { "_id" : "钱钟书", "value" : 165.0 } { "_id" : "鲁迅", "value" : 93.0 }
別の例として、次のように、各著者が出版した本の数をクエリしたいとします。
var map=function(){emit(this.name,1)} var reduce=function(key,value){return Array.sum(value)} var options={out:"bookNum"} db.sang_books.mapReduce(map,reduce,options); db.bookNum.find()
クエリの結果は次のとおりです。
{ "_id" : "曹雪芹", "value" : 1.0 } { "_id" : "钱钟书", "value" : 2.0 } { "_id" : "鲁迅", "value" : 2.0 }
各著者の書籍を次のようにリストします。
var map=function(){emit(this.name,this.book)} var reduce=function(key,value){return value.join(',')} var options={out:"books"} db.sang_books.mapReduce(map,reduce,options); db.books.find()
結果は以下の通りです:
{ "_id" : "曹雪芹", "value" : "红楼梦" } { "_id" : "钱钟书", "value" : "宋诗选注,谈艺录" } { "_id" : "鲁迅", "value" : "呐喊,彷徨" }
例えば、各人が¥40以上で売っている本をクエリするには:
var map=function(){emit(this.name,this.book)} var reduce=function(key,value){return value.join(',')} var options={query:{price:{$gt:40}},out:"books"} db.sang_books.mapReduce(map,reduce,options); db.books.find()
クエリは、見つかったコレクションをフィルタリングすることを意味します。
結果は次のとおりです:
{ "_id" : "钱钟书", "value" : "宋诗选注,谈艺录" } { "_id" : "鲁迅", "value" : "彷徨" }
runCommandの実装
runCommandコマンドを使用してMapReduceを実行することもできます。形式は次のとおりです:
db.runCommand( { mapReduce: <collection>, map: <function>, reduce: <function>, finalize: <function>, out: <output>, query: <document>, sort: <document>, limit: <number>, scope: <document>, jsMode: <boolean>, verbose: <boolean>, bypassDocumentValidation: <boolean>, collation: <document> } )
map | |
reduce | |
finalize | |
out | |
クエリ | |
並べ替え | |
limit | |
scope | |
jsMode | |
verbose | |
bypassDocumentValidation | |
照合 | |
次の操作は、MapReduce 操作の実行を表します。次に、統計収集のために返される項目の数を制限し、返される項目の数を制限した後で統計操作を実行します。 |
{ "_id" : "曹雪芹", "value" : "红楼梦" } { "_id" : "钱钟书", "value" : "宋诗选注,谈艺录" } { "_id" : "鲁迅", "value" : "呐喊" }
私の友人は、魯迅の本が 1 冊なくなっていることに気付きました。これは、統計演算を実行する前に、コレクションから返されるアイテムの数を制限するという制限が最初に設定されていたためです。
finalize 操作は、次のように最終処理関数を表します:
var f1 = function(key,reduceValue){var obj={};obj.author=key;obj.books=reduceValue; return obj} var map=function(){emit(this.name,this.book)} var reduce=function(key,value){return value.join(',')} db.runCommand({mapreduce:'sang_books',map,reduce,out:"books",finalize:f1}) db.books.find()
f1 の最初のパラメーター キーは、emit の最初のパラメーターを表し、2 番目のパラメーターは、reduce の実行結果を表します。この結果を f1 で再処理できます。は次のとおりです:
{ "_id" : "曹雪芹", "value" : { "author" : "曹雪芹", "books" : "红楼梦" } } { "_id" : "钱钟书", "value" : { "author" : "钱钟书", "books" : "宋诗选注,谈艺录" } } { "_id" : "鲁迅", "value" : { "author" : "鲁迅", "books" : "呐喊,彷徨" } }
scope は、次のように、map、reduce、および Finalize で表示される変数を定義するために使用できます:
var f1 = function(key,reduceValue){var obj={};obj.author=key;obj.books=reduceValue;obj.sang=sang; return obj} var map=function(){emit(this.name,this.book)} var reduce=function(key,value){return value.join(',--'+sang+'--,')} db.runCommand({mapreduce:'sang_books',map,reduce,out:"books",finalize:f1,scope:{sang:"haha"}}) db.books.find()
実行結果は次のとおりです:
{ "_id" : "曹雪芹", "value" : { "author" : "曹雪芹", "books" : "红楼梦", "sang" : "haha" } } { "_id" : "钱钟书", "value" : { "author" : "钱钟书", "books" : "宋诗选注,--haha--,谈艺录", "sang" : "haha" } } { "_id" : "鲁迅", "value" : { "author" : "鲁迅", "books" : "呐喊,--haha--,彷徨", "sang" : "haha" } }
これを読んで何かを得ることができれば幸いです記事。
関連する推奨事項:
mongodb MapReduceの使用法とPHPサンプルコード以上がMongoDB での MapReduce の使用の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。