Maison  >  Article  >  développement back-end  >  Utilisation de MapReduce dans MongoDB

Utilisation de MapReduce dans MongoDB

小云云
小云云original
2017-12-08 14:26:171869parcourir

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 其他一些校对
L'opération suivante consiste à effectuer une opération MapReduce et à limiter le nombre d'éléments renvoyés à l'ensemble statistique, puis effectuer des opérations statistiques après avoir limité le nombre d'éléments retournés, comme suit :

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!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn