ホームページ  >  記事  >  バックエンド開発  >  MongoDB での MapReduce の使用

MongoDB での MapReduce の使用

小云云
小云云オリジナル
2017-12-08 14:26:171853ブラウズ

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>
               }
             )

意味は次のとおりです:

パラメータ の意味 mapReduce は操作対象のセットを表しますマップ機能reduce関数最終処理関数出力セット結果をフィルタリングする結果を並べ替えますreturned 結果の数ここで設定した値はmap関数、reduce関数、finalize関数に表示されますの中間データを変換するかどうか。 JavaScript オブジェクトから BSON オブジェクトへの実行マップ、デフォルトは false に設定詳細な時間統計を表示するかどうか文書検証をバイパスするかどうかその他の校正次の操作は、MapReduce 操作の実行を表します。次に、統計収集のために返される項目の数を制限し、返される項目の数を制限した後で統計操作を実行します。
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",limit:4,verbose:true})
db.books.find()
実行結果は次のとおりです。
map
reduce
finalize
out
クエリ
並べ替え
limit
scope
jsMode
verbose
bypassDocumentValidation
照合
{
    "_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の速度を20倍にする方法

OracleデータベースにMapReduceを実装する

以上がMongoDB での MapReduce の使用の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。