Maison > Article > développement back-end > Utilisation de MapReduce dans MongoDB
Les amis qui ont joué à Hadoop devraient être familiers avec MapReduce. MapReduce est puissant et flexible. Il peut diviser un gros problème en plusieurs petits problèmes et envoyer chaque petit problème à différentes machines pour traitement. les résultats des calculs sont combinés dans une solution complète. C'est ce qu'on appelle l'informatique distribuée. Dans cet article, nous examinerons l'utilisation de MapReduce dans MongoDB.
mapReduce
MapReduce dans MongoDB peut être utilisé pour implémenter des commandes d'agrégation plus complexes. L'utilisation de MapReduce implémente principalement deux fonctions : la fonction map et la fonction de réduction. La fonction est utilisée pour générer une séquence de paires clé-valeur. Le résultat de la fonction map est utilisé comme paramètre de la fonction de réduction. D'autres statistiques sont effectuées dans la fonction de réduction. Par exemple, mon ensemble de données est le suivant :
{"_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" : "花城出版社"}Si je souhaite interroger chacun Le prix total des livres publiés par les auteurs, l'opération est la suivante :
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()la fonction d'émission est principalement utilisée pour implémenter le regroupement et reçoit deux paramètres. Le premier paramètre représente le champ de regroupement et le deuxième paramètre représente les données statistiques souhaitées. Réduire effectue des opérations de traitement de données spécifiques et reçoit deux paramètres, correspondant aux deux paramètres de la méthode d'émission. Ici, la fonction somme dans Array est utilisée pour. auto-traiter le champ de prix. Les options sont définies dans les options pour afficher les résultats de la collection, puis nous interrogerons les données de cette collection. Par défaut, cette collection sera conservée même après le redémarrage de la base de données, ainsi que les données de la collection. la collection sera conservée. Les résultats de la requête sont les suivants :
{ "_id" : "曹雪芹", "value" : 22.0 } { "_id" : "钱钟书", "value" : 165.0 } { "_id" : "鲁迅", "value" : 93.0 }Pour un autre exemple, je souhaite demander combien de livres chaque auteur a publié, comme suit :
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()Les résultats de la requête sont les suivants :
{ "_id" : "曹雪芹", "value" : 1.0 } { "_id" : "钱钟书", "value" : 2.0 } { "_id" : "鲁迅", "value" : 2.0 }Listez les livres de chaque auteur comme suit :
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()Les résultats sont les suivants :
{ "_id" : "曹雪芹", "value" : "红楼梦" } { "_id" : "钱钟书", "value" : "宋诗选注,谈艺录" } { "_id" : "鲁迅", "value" : "呐喊,彷徨" }Par exemple, interrogez les livres vendus par chaque auteur pendant plus de ¥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()la requête signifie filtrer la collection trouvée. Les résultats sont les suivants :
{ "_id" : "钱钟书", "value" : "宋诗选注,谈艺录" } { "_id" : "鲁迅", "value" : "彷徨" }Implémentation de runCommand Nous pouvons également utiliser la commande runCommand pour exécuter MapReduce. Le format est le suivant :
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> } )La signification est la suivante :
参数 | 含义 |
---|---|
mapReduce | 表示要操作的集合 |
map | map函数 |
reduce | reduce函数 |
finalize | 最终处理函数 |
out | 输出的集合 |
query | 对结果进行过滤 |
sort | 对结果排序 |
limit | 返回的结果数 |
scope | 设置参数值,在这里设置的值在map、reduce、finalize函数中可见 |
jsMode | 是否将map执行的中间数据由javascript对象转换成BSON对象,默认为false |
verbose | 是否显示详细的时间统计信息 |
bypassDocumentValidation | 是否绕过文档验证 |
collation | 其他一些校对 |
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()Les résultats de l'exécution sont les suivants :
{ "_id" : "曹雪芹", "value" : "红楼梦" } { "_id" : "钱钟书", "value" : "宋诗选注,谈艺录" } { "_id" : "鲁迅", "value" : "呐喊" }Mes amis ont vu celui de Lu Xun. books manquait, car limit limite d'abord le nombre d'éléments renvoyés par la collection, puis effectue à nouveau des opérations statistiques. L'opération de finalisation représente la fonction de traitement finale, comme suit :
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 La première clé de paramètre représente le premier paramètre d'émission et le deuxième paramètre représente le résultat de l'exécution de réduire. We Ce résultat peut être retraité en f1, et le résultat est le suivant :
{ "_id" : "曹雪芹", "value" : { "author" : "曹雪芹", "books" : "红楼梦" } } { "_id" : "钱钟书", "value" : { "author" : "钱钟书", "books" : "宋诗选注,谈艺录" } } { "_id" : "鲁迅", "value" : { "author" : "鲁迅", "books" : "呐喊,彷徨" } }scope peut être utilisé pour définir une variable visible dans map, réduire et finaliser, comme suit :
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()Les résultats d'exécution sont les suivants :
{ "_id" : "曹雪芹", "value" : { "author" : "曹雪芹", "books" : "红楼梦", "sang" : "haha" } } { "_id" : "钱钟书", "value" : { "author" : "钱钟书", "books" : "宋诗选注,--haha--,谈艺录", "sang" : "haha" } } { "_id" : "鲁迅", "value" : { "author" : "鲁迅", "books" : "呐喊,--haha--,彷徨", "sang" : "haha" } }J'espère que vous gagnerez quelque chose en lisant cet article. Recommandations associées :
Utilisation de MongoDB mapreduce et exemple de code PHP
Comment augmenter la vitesse de MongoDB MapReduce de 20 fois
Implémentation de MapReduce dans la base de données Oracle
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!