【大数据存储与处理】实验六 MongoDB 聚合函数 MapReduce

发布时间:2023年12月20日

实验六?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)?查询每位作者所出的书的总价,操作如下:?

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

2)?查询每个人售价在¥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()?

注:query?表示对查到的集合再进行筛选。?

第二部分:先导入数据。?

编写?python?程序导入数据至数据库淘宝,集合为?order_info?

from pymongo import MongoClient
from random import randint
import datetime
client = MongoClient('mongodb://192.168.226.132:27017/')
db = client.taobao
order = db.order_info
status = ['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?函数:?

var?mapFunction1?=?function()?{?

emit(this.cust_id,?this.price);?

};?

2.定义?reduce?函数:?

var?reduceFunction1?=?function(keyCustId,?valuesPrices)?{?

return?Array.sum(valuesPrices);?

};?

3.执行?mapreduce,输出结果到当前?db?的?map_reduce_example?集合中:?

db.order_info.mapReduce(?

mapFunction1,?

reduceFunction1,?

{?out:?"map_reduce_example"?}?

)?

4.查询结果?

题目二:计算所有?items?的平均库存?

1map?函数?

var?mapFunction2?=?function()?{?

for?(var?idx?=?0;?idx?<?this.items.length;?idx++)?{?

var?key?=?this.items[idx].sku;?

var?value?=?{?

count:?1,?

qty:?this.items[idx].qty?

};?

emit(key,?value);?

}?

};?

2reduce?函数?

var?reduceFunction2?=?function(keySKU,?countObjVals)?{?

reducedVal?=?{?count:?0,?qty:?0?};?

for?(var?idx?=?0;?idx?<?countObjVals.length;?idx++)?{?

reducedVal.count?+=?countObjVals[idx].count;?

reducedVal.qty?+=?countObjVals[idx].qty;?

}?

return?reducedVal;?

};?

3finalize?函数?

var?finalizeFunction2?=?function?(key,?reducedVal)?{?

reducedVal.avg?=?reducedVal.qty/reducedVal.count;?

return?reducedVal;?

};?

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?对大规模数据集进行聚合和处理,生成统计信息和计算结果等。这是一种强大的数据处理工具,在处理复杂数据操作和分析时非常有用。

文章来源:https://blog.csdn.net/qq_42531954/article/details/135102978
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。