Heim > Artikel > Backend-Entwicklung > Verwendung von MapReduce in MongoDB
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" : "彷徨" }
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!