实验六MongoDB聚合函数MapReduce
【实验目的】:
1.掌握mongodb的mapreduce聚合函数。
【实验内容与要求】:
MongoDB有两种聚合函数:aggregate与mapreduce
mapreduce函数提供的是mapreduce(编程模型)的聚合操作,下面我们来看一下:
第一部分:先导入数据
建立集合sang_books,输入以下数据:
{“_id”:1,”name”:”鲁迅“,”book”:”呐喊“,”price”:38.0,”publisher”:”人民文学出版社“}
{“_id”:2,”name”:”曹雪芹“,”book”:”红楼梦“,”price”:22.0,”publisher”:”人民文学出版
社“}
{“_id”:3,”name”:”钱钟书“,”book”:”宋诗选注“,”price”:99.0,”publisher”:”人民文学出
版社“}
{“_id”:4,”name”:”钱钟书“,”book”:”谈艺录“,”price”:66.0,”publisher”:”三联书店“}
{“_id”:5,”name”:”鲁迅“,”book”:”彷徨“,”price”:55.0,”publisher”:”花城出版社“}
(1)查询每位作者所出的书的总价,操作如下:
varmap=function(){emit(this.name,this.price)}
varreduce=function(key,value){returnArray.sum(value)}
varoptions={out:”totalPrice”}
db.sang_books.mapReduce(map,reduce,options);
db.totalPrice.find()
(
2)查询每个人售价在¥40以上的书:
varmap=function(){emit(this.name,this.book)}
varreduce=function(key,value){returnvalue.join(‘,’)}
varoptions={query:{price:{$gt:40}},out:”books”}
db.sang_books.mapReduce(map,reduce,options);
db.books.find()
注:query表示对查到的集合再进行筛选。
第二部分:先导入数据。
编写python程序导入数据至数据库淘宝,集合为order_info
from pymongo import MongoClientfrom random import randintimport datetimeclient = MongoClient('mongodb://192.168.226.132:27017/')db = client.taobaoorder = db.order_infostatus = ['A','B','C']cust_id = ['A123','B123','C123']price = [500,200,250,300]sku = ['mmm','nnn']for i in range(1,100):items = []item_count =randint(2,6) for n in range(item_count):items.append({"sku":sku[randint(0,1)],"qty":randint(1,10),"price":randint(0,5)})new = {"status":status[randint(0,2)],"cust_id":cust_id[randint(0,2)],"price":price[randint(0,3)],"ord_date":datetime.datetime.utcnow(),"items":items}print(new)order.insert_one(new)print(order.estimated_document_count())
2.查看数据格式
题目一:查询每个cust_id的所有price总和
1.定义map函数:
varmapFunction1=function(){
emit(this.cust_id,this.price);
};
2.定义reduce函数:
varreduceFunction1=function(keyCustId,valuesPrices){
returnArray.sum(valuesPrices);
};
3.执行mapreduce,输出结果到当前db的map_reduce_example集合中:
db.order_info.mapReduce(
mapFunction1,
reduceFunction1,
{out:”map_reduce_example”}
)
4.查询结果
题目二:计算所有items的平均库存
1.map函数
varmapFunction2=function(){
for(varidx=0;idx<this.items.length;idx++){
varkey=this.items[idx].sku;
varvalue={
count:1,
qty:this.items[idx].qty
};
emit(key,value);
}
};
2.reduce函数
varreduceFunction2=function(keySKU,countObjVals){
reducedVal={count:0,qty:0};
for(varidx=0;idx<countObjVals.length;idx++){
reducedVal.count+=countObjVals[idx].count;
reducedVal.qty+=countObjVals[idx].qty;
}
returnreducedVal;
};
3.finalize函数
varfinalizeFunction2=function(key,reducedVal){
reducedVal.avg=reducedVal.qty/reducedVal.count;
returnreducedVal;
};
4.执行mapreduce
db.order_info.mapReduce(mapFunction2,
reduceFunction2,
{
out:{merge:”map_reduce_example”},
finalize:finalizeFunction2
}
)
5.查看执行结果
综上所述,使用mapreduce比aggregate复杂,但是更为灵活
思考题:MongoDB中的MapReduce主要有哪几个过程?
在MongoDB中,MapReduce包括以下几个主要过程:
1.Map(映射):通过编写一个JavaScript函数,将输入数据集中的每个文档转换为键值对。这个函数被称为”map”函数。它可以根据需要提取文档中的字段,并生成一个或多个键值对。
2.Shuffle&Sort(洗牌和排序):在Map阶段之后,将所有生成的键值对进行排序和分组,以便于后续的Reduce阶段进行处理。这个过程是自动执行的,无需手动操作。
3.Reduce(缩减):对洗牌和排序后的键值对进行归约操作。使用一个JavaScript函数,将具有相同键的值进行聚合、计算或其他处理。这个函数被称为”reduce”函数。Reduce阶段可以根据需要执行多次。
4.Finalize(最终化):可选的步骤,用于对Reduce阶段的结果进行最终的转换或处理。这个步骤允许进一步修改或处理最终的输出结果。
5.Output(输出):将最终处理的结果保存到指定的集合中,以供后续查询和分析使用。
通过上述过程,MapReduce提供了一种强大的方式来对大规模数据集进行聚合和处理,并生成统计信息、计算结果等。
小结
学会使用mongodb的mapreduce聚合函数。
在本次实验中,我们学习了MongoDB的MapReduce聚合函数。主要内容包括:
1.了解MongoDB的两种聚合函数:aggregate和mapreduce。
2.着重学习了mapreduce函数的使用。
3.MapReduce提供了一种基于编程模型的聚合操作。
4.MapReduce过程包括Map、Shuffle&Sort、Reduce、Finalize和Output阶段。
5.Map阶段将文档转换为键值对。
6.Shuffle&Sort阶段对键值对进行排序和分组。
7.Reduce阶段对具有相同键的值进行聚合处理。
8.可选的Finalize阶段对Reduce结果进行最终转换或处理。
9.输出结果保存到指定集合中供后续查询和分析使用。
通过掌握MapReduce,可以利用MongoDB对大规模数据集进行聚合和处理,生成统计信息和计算结果等。这是一种强大的数据处理工具,在处理复杂数据操作和分析时非常有用。