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

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

相关推荐

  1. 数据存储处理技术之Spark

    2023-12-22 17:38:03       30 阅读
  2. ScrapyMongoDB的异步数据存储

    2023-12-22 17:38:03       9 阅读

最近更新

  1. TCP协议是安全的吗?

    2023-12-22 17:38:03       17 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2023-12-22 17:38:03       16 阅读
  3. 【Python教程】压缩PDF文件大小

    2023-12-22 17:38:03       15 阅读
  4. 通过文章id递归查询所有评论(xml)

    2023-12-22 17:38:03       18 阅读

热门阅读

  1. MySQL数据备份

    2023-12-22 17:38:03       41 阅读
  2. mysql 表锁 行锁

    2023-12-22 17:38:03       36 阅读
  3. openstack-keystone服务

    2023-12-22 17:38:03       37 阅读
  4. SQL server 数据库 SQL语句高级用法

    2023-12-22 17:38:03       30 阅读
  5. GO设计模式——25、模板模式(行为型)

    2023-12-22 17:38:03       37 阅读
  6. ThreadLocal和Synchronized的用法和区别

    2023-12-22 17:38:03       46 阅读
  7. 6.1 指针的认识

    2023-12-22 17:38:03       38 阅读