Utilisation de MapReduce dans MongoDB

小云云
Libérer: 2023-03-17 20:26:01
original
1857 Les gens l'ont consulté

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" : "花城出版社"}
Copier après la connexion
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()
Copier après la connexion
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
}
Copier après la connexion
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()
Copier après la connexion
Les résultats de la requête sont les suivants :

{
    "_id" : "曹雪芹",
    "value" : 1.0
}
{
    "_id" : "钱钟书",
    "value" : 2.0
}
{
    "_id" : "鲁迅",
    "value" : 2.0
}
Copier après la connexion
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()
Copier après la connexion
Les résultats sont les suivants :

{
    "_id" : "曹雪芹",
    "value" : "红楼梦"
}
{
    "_id" : "钱钟书",
    "value" : "宋诗选注,谈艺录"
}
{
    "_id" : "鲁迅",
    "value" : "呐喊,彷徨"
}
Copier après la connexion
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()
Copier après la connexion
la requête signifie filtrer la collection trouvée.

Les résultats sont les suivants :

{
    "_id" : "钱钟书",
    "value" : "宋诗选注,谈艺录"
}
{
    "_id" : "鲁迅",
    "value" : "彷徨"
}
Copier après la connexion
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>
               }
             )
Copier après la connexion
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()
Copier après la connexion
Les résultats de l'exécution sont les suivants :

{
    "_id" : "曹雪芹",
    "value" : "红楼梦"
}
{
    "_id" : "钱钟书",
    "value" : "宋诗选注,谈艺录"
}
{
    "_id" : "鲁迅",
    "value" : "呐喊"
}
Copier après la connexion
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()
Copier après la connexion
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" : "呐喊,彷徨"
    }
}
Copier après la connexion
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()
Copier après la connexion
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"
    }
}
Copier après la connexion
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!

Étiquettes associées:
source:php.cn
Déclaration de ce site Web
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
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal