Heim  >  Artikel  >  Backend-Entwicklung  >  Verwendung von MapReduce in MongoDB

Verwendung von MapReduce in MongoDB

小云云
小云云Original
2017-12-08 14:26:171801Durchsuche

Freunde, die Hadoop gespielt haben, sollten mit MapReduce vertraut sein. Es ist leistungsstark und flexibel. Es kann ein großes Problem in mehrere kleine Probleme aufteilen und jedes kleine Problem zur Verarbeitung an alle Maschinen senden Berechnungsergebnisse werden zu einer Gesamtlösung zusammengefasst. Dies wird als verteiltes Rechnen bezeichnet. In diesem Artikel werfen wir einen Blick auf die Verwendung von MapReduce in MongoDB.

mapReduce

MapReduce in MongoDB kann zum Implementieren komplexerer Aggregationsbefehle verwendet werden: Map-Funktion und Reduce-Funktion Die Funktion wird verwendet, um eine Folge von Schlüssel-Wert-Paaren zu generieren. Das Ergebnis der Kartenfunktion wird als Parameter der Reduzierungsfunktion verwendet. Mein Datensatz lautet beispielsweise wie folgt:

{"_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" : "花城出版社"}

Wenn ich jeden abfragen möchte Der Gesamtpreis der von einem Autor veröffentlichten Bücher Die Operation ist wie folgt:

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

Die Emit-Funktion wird hauptsächlich zum Implementieren der Gruppierung verwendet und empfängt zwei Parameter Der erste Parameter stellt das Gruppierungsfeld dar, und der zweite Parameter stellt das gewünschte dar. Für statistische Daten führt Reduce bestimmte Datenverarbeitungsvorgänge durch und empfängt zwei Parameter, die den beiden Parametern der Emit-Methode entsprechen Wird zur Selbstverarbeitung des Preisfelds verwendet. Die Optionen zur Ausgabe der Ergebnisse werden von uns standardmäßig abgefragt. Diese Sammlung bleibt auch nach einem Neustart der Datenbank erhalten in der Sammlung bleiben erhalten. Die Abfrageergebnisse lauten wie folgt:

{
    "_id" : "曹雪芹",
    "value" : 22.0
}
{
    "_id" : "钱钟书",
    "value" : 165.0
}
{
    "_id" : "鲁迅",
    "value" : 93.0
}

Für ein weiteres Beispiel möchte ich wie folgt abfragen, wie viele Bücher jeder Autor veröffentlicht hat:

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

Die Abfrageergebnisse lauten wie folgt :

{
    "_id" : "曹雪芹",
    "value" : 1.0
}
{
    "_id" : "钱钟书",
    "value" : 2.0
}
{
    "_id" : "鲁迅",
    "value" : 2.0
}

Listen Sie die Bücher jedes Autors wie folgt auf:

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

Die Ergebnisse sind wie folgt:

{
    "_id" : "曹雪芹",
    "value" : "红楼梦"
}
{
    "_id" : "钱钟书",
    "value" : "宋诗选注,谈艺录"
}
{
    "_id" : "鲁迅",
    "value" : "呐喊,彷徨"
}

Fragen Sie beispielsweise die verkauften Bücher ab von jedem Autor für mehr als ¥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()

Abfrage bedeutet Filtern der gefundenen Sammlung.

Die Ergebnisse sind wie folgt:

{
    "_id" : "钱钟书",
    "value" : "宋诗选注,谈艺录"
}
{
    "_id" : "鲁迅",
    "value" : "彷徨"
}

runCommand-Implementierung

Wir können auch den runCommand-Befehl verwenden, um MapReduce auszuführen. Das Format ist wie folgt:

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

Die Bedeutung ist wie folgt:

参数 含义
mapReduce 表示要操作的集合
map map函数
reduce reduce函数
finalize 最终处理函数
out 输出的集合
query 对结果进行过滤
sort 对结果排序
limit 返回的结果数
scope 设置参数值,在这里设置的值在map、reduce、finalize函数中可见
jsMode 是否将map执行的中间数据由javascript对象转换成BSON对象,默认为false
verbose 是否显示详细的时间统计信息
bypassDocumentValidation 是否绕过文档验证
collation 其他一些校对

Die folgende Operation bedeutet, eine MapReduce-Operation auszuführen und die Anzahl der an den statistischen Satz zurückgegebenen Elemente zu begrenzen. und dann statistische Operationen durchführen, nachdem die Anzahl der zurückgegebenen Elemente wie folgt begrenzt wurde:

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

Die Ausführungsergebnisse sind wie folgt:

{
    "_id" : "曹雪芹",
    "value" : "红楼梦"
}
{
    "_id" : "钱钟书",
    "value" : "宋诗选注,谈艺录"
}
{
    "_id" : "鲁迅",
    "value" : "呐喊"
}

Meine Freunde haben das von Lu Xun gesehen Bücher fehlten, da limit zunächst die Anzahl der aus der Sammlung zurückgegebenen Elemente begrenzt und dann erneut statistische Operationen durchführt.

Die Finalisierungsoperation stellt die endgültige Verarbeitungsfunktion wie folgt dar:

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 Der erste Parameterschlüssel stellt den ersten Parameter in Emit dar, und der zweite Parameter stellt das Ausführungsergebnis von Reduce dar. Dieses Ergebnis kann in f1 erneut verarbeitet werden, und das Ergebnis ist wie folgt:

{
    "_id" : "曹雪芹",
    "value" : {
        "author" : "曹雪芹",
        "books" : "红楼梦"
    }
}
{
    "_id" : "钱钟书",
    "value" : {
        "author" : "钱钟书",
        "books" : "宋诗选注,谈艺录"
    }
}
{
    "_id" : "鲁迅",
    "value" : {
        "author" : "鲁迅",
        "books" : "呐喊,彷徨"
    }
}

scope kann wie folgt verwendet werden, um eine Variable zu definieren, die in der Karte sichtbar ist, zu reduzieren und zu finalisieren:

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

Die Ausführungsergebnisse sind wie folgt:

{
    "_id" : "曹雪芹",
    "value" : {
        "author" : "曹雪芹",
        "books" : "红楼梦",
        "sang" : "haha"
    }
}
{
    "_id" : "钱钟书",
    "value" : {
        "author" : "钱钟书",
        "books" : "宋诗选注,--haha--,谈艺录",
        "sang" : "haha"
    }
}
{
    "_id" : "鲁迅",
    "value" : {
        "author" : "鲁迅",
        "books" : "呐喊,--haha--,彷徨",
        "sang" : "haha"
    }
}

Ich hoffe, dass Sie durch die Lektüre dieses Artikels etwas gewinnen werden.

Verwandte Empfehlungen:

MongoDB MapReduce-Nutzung und PHP-Beispielcode

So erhöhen Sie die MongoDB MapReduce-Geschwindigkeit um das 20-fache

MapReduce in der Oracle-Datenbank implementieren

Das obige ist der detaillierte Inhalt vonVerwendung von MapReduce in MongoDB. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn