MongoDB——聚合操作之MapReduce

x33g5p2x  于2022-04-27 转载在 MapReduce  
字(1.9k)|赞(0)|评价(0)|浏览(444)

一、MapReduce的概述

  • MapReduce操作将大量的数据处理工作拆分成多个线程并行处理,然后将结果合并在一起。MongoDB提供的Map-Reduce非常灵活,对于大规模数据分析也相当实用。

二、MapReduce的阶段

  • MapReduce具有两个阶段:
    (1)、将具有相同Key的文档数据整合在一起的map阶段;
    (2)、组合map操作的结果进行统计输出的reduce阶段。

三、MapReduce的基本语法

  • MapReduce语法格式
db.collection.mapReduce(
	function() {emit(key,value);}, //map 函数
	function(key,values) {return reduceFunction}, //reduce 函数
	{
		out: <collection>,
		query: <document>,
		sort: <document>, 
		limit: <number>,
		finalize: <function>, 
		scope: <document>, 
		jsMode: <boolean>,
		verbose: <boolean>, 
		bypassDocumentValidation: <boolean>
	}
)
  • MapReduce语法解释
函数解释
map将数据拆分成键值对,交给reduce函数
reduce根据键将值做统计运算
out可选,将结果汇入指定表
quey可选筛选数据的条件,筛选的数据送入map
sort排序完后,送入map
limit限制送入map的文档数
finalize可选,修改reduce的结果后进行输出
scope可选,指定map、reduce、finalize的全局变量
jsMode可选,默认false。在mapreduce过程中是否将数 据转换成bson格式。
verbose可选,是否在结果中显示时间,默认false
bypassDocmentValidation可选,是否略过数据校验
  • MapReduce图解

四、MapReduce示例

4.1、 数据准备

  • 准备数据集,执行脚本
var tags = ["nosql","mongodb","document","developer","popular"];
var types = ["technology","sociality","travel","novel","literature"];
var books=[];
for(var i=0;i<50;i++){
	var typeIdx = Math.floor(Math.random()*types.length);
	var tagIdx = Math.floor(Math.random()*tags.length);
	var tagIdx2 = Math.floor(Math.random()*tags.length);
	var favCount = Math.floor(Math.random()*100);
	var username = "xx00"+Math.floor(Math.random()*10);
	var age = 20 + Math.floor(Math.random()*15);
	var book = {
		title: "book-"+i, 
		type: types[typeIdx],
		tag: [tags[tagIdx],tags[tagIdx2]],
		favCount: favCount, 
		author: {name:username,age:age}
	};
	books.push(book)
}
db.books1.insertMany(books);

4.2、 MapReduce示例

  • 统计type为travel的不同作者的books文档收藏数
db.books1.mapReduce( 
	function(){emit(this.author.name,this.favCount)}, 
	function(key,values){return Array.sum(values)}, 
	{ 
		query:{type:"travel"}, 
		out: "books_favCount" 
	} 
)

  • 由于结果输出到了books_favCount中,所以需要去books_favCount中查看结果
> db.books_favCount.find()

相关文章