iis服务器助手广告广告
返回顶部
首页 > 资讯 > 数据库 >MongoDB:MapReduce基础及实例
  • 221
分享到

MongoDB:MapReduce基础及实例

2024-04-02 19:04:59 221人浏览 安东尼
摘要

背景     mapReduce是个非常灵活和强大的数据聚合工具。它的好处是可以把一个聚合任务分解为多个小的任务,分配到多服务器上并行处理。mongoDB也提供了Ma

背景

     mapReduce是个非常灵活和强大的数据聚合工具。它的好处是可以把一个聚合任务分解为多个小的任务,分配到多服务器上并行处理。

mongoDB也提供了MapReduce,当然查询语肯定是javascript。MonGoDB中的MapReduce主要有以下几阶段:

   1. Map:把一个操作Map到集合中的每一个文档

   2. Shuffle: 根据Key分组对文档,并且为每个不同的Key生成一系列(>=1个)的值表(List of values)。

   3. Reduce: 处理值表中的元素,直到值表中只有一个元素。然后将值表返回到Shuffle过程,循环处理,直到每个Key只对应一个值表,并且此值表中只有一个元素,这就是MR的结果。

   4. Finalize:此步骤不是必须的。在得到MR最终结果后,再进行一些数据“修剪”性质的处理。

MongoDB中使用emit函数向MapReduce提供Key/Value对。

Reduce函数接受两个参数:Key,emits. Key即为emit函数中的Key。 emits是一个数组,它的元素就是emit函数提供的Value。

Reduce函数的返回结果必须要能被Map或者Reduce重复使用,所以返回结果必须与emits中元素结构一致。

Map或者Reduce函数中的this关键字,代表当前被Mapping文档。

实例

  测试数据: 这个集合是三个用户购买的产品和产品价格的数据。

CodeCodefor(var i=0;i<1000;i++){ 
var rID=Math.floor(Math.random()*10); 
var priceparseFloat((Math.random()*10).toFixed(2)); 
if(rID<4){ 
    db.test.insert({"user":"Joe","sku":rID,"price":price}); 
} 
else if(rID>=4 && rID<7)
{ 
   db.test.insert({"user":"Josh","sku":rID,"price":price}); 
} 
else {  
db.test.insert({"user":"Ken","sku":rID,"price":price}); 
     } 
}


  1. 每个用户各购买了多少个产品?(单一Key做MR)

Code//sql实现select user,count(sku) from test
group by user//MapReduce实现map=function (){
 emit(this.user,{count:1})
}

reduce=function (key,values){ var cnt=0;   
values.forEach(function(val){ cnt+=val.count;});  
return {"count":cnt};
}//MR结果存到集合mr1db.test.mapReduce(map,reduce,{out:"mr1"})//查看MR之后结果> db.mr1.find()
{ "_id" : "Joe", "value" : { "count" : 416 } }
{ "_id" : "Josh", "value" : { "count" : 287 } }
{ "_id" : "Ken", "value" : { "count" : 297 } }



2. 每个用户不同的产品购买了多少个?(复合Key做MR)

Code//SQL实现select user,sku,count(*) from test
group by user,sku//MapReduce实现map=function (){
 emit({user:this.user,sku:this.sku},{count:1})
}

reduce=function (key,values){ var cnt=0;   
values.forEach(function(val){ cnt+=val.count;});  
return {"count":cnt};
}

db.test.mapReduce(map,reduce,{out:"mr2"})
> db.mr2.find()
{ "_id" : { "user" : "Joe", "sku" : 0 }, "value" : { "count" : 103 } }
{ "_id" : { "user" : "Joe", "sku" : 1 }, "value" : { "count" : 106 } }
{ "_id" : { "user" : "Joe", "sku" : 2 }, "value" : { "count" : 102 } }
{ "_id" : { "user" : "Joe", "sku" : 3 }, "value" : { "count" : 105 } }
{ "_id" : { "user" : "Josh", "sku" : 4 }, "value" : { "count" : 87 } }
{ "_id" : { "user" : "Josh", "sku" : 5 }, "value" : { "count" : 107 } }
{ "_id" : { "user" : "Josh", "sku" : 6 }, "value" : { "count" : 93 } }
{ "_id" : { "user" : "Ken", "sku" : 7 }, "value" : { "count" : 98 } }
{ "_id" : { "user" : "Ken", "sku" : 8 }, "value" : { "count" : 83 } }
{ "_id" : { "user" : "Ken", "sku" : 9 }, "value" : { "count" : 116 } }


3. 每个用户购买的产品数量,总金额是多少?(复合Reduce结果处理)

Code//SQL实现select user,count(sku),sum(price) from test
group by user//MapReduce实现map=function (){
  emit(this.user,{amount:this.price,count:1})
}

reduce=function (key,values){ var res={amount:0,count:0}
values.forEach(function(val){ 
    res.amount+=val.amount;
    res.count+=val.count
});  
return res;
}

db.test.mapReduce(map,reduce,{out:"mr3"})

> db.mr3.find()
{ "_id" : "Joe", "value" : { "amount" : 2053.8899999999994, "count" : 395 } }
{ "_id" : "Josh", "value" : { "amount" : 1409.2600000000002, "count" : 292 } }
{ "_id" : "Ken", "value" : { "amount" : 1547.7700000000002, "count" : 313 } }


4. 在3中返回的amount的float精度需要改成两位小数,还需要得到商品的平均价格。(使用Finalize处理reduce结果集)

Code//SQL实现select user,cast(sum(price) as   decimal(10,   2)) as amount,count(sku) as [count],
cast((sum(price)/count(sku))  as decimal(10,2)) as avgPrice
from test
group by user//MapReduce实现map=function (){
  emit(this.user,{amount:this.price,count:1,avgPrice:0})
}

reduce=function (key,values){ var res={amount:0,count:0,avgPrice:0}
values.forEach(function(val){ 
    res.amount+=val.amount;
    res.count+=val.count
});  
return res;
}

finalizeFun=function (key,reduceResult){
 reduceResult.amount=(reduceResult.amount).toFixed(2);
 reduceResult.avgPrice=(reduceResult.amount/reduceResult.count).toFixed(2); return reduceResult;}

 db.test.mapReduce(map,reduce,{out:"mr4",finalize:finalizeFun})
> db.mr4.find()
{ "_id" : "Joe", "value" : { "amount" : "2053.89", "count" : 395, "avgPrice" : "5.20" } }
{ "_id" : "Josh", "value" : { "amount" : "1409.26", "count" : 292, "avgPrice" : "4.83" } }
{ "_id" : "Ken", "value" : { "amount" : "1547.77", "count" : 313, "avgPrice" : "4.94" } }


5. 统计单价大于6的SKU,每个用户的购买数量.(筛选数据子集做MR)

  这个比较简单了,只需要将1.中调用MR时加上筛选查询即可,其它不变.

Codedb.test.mapReduce(map,reduce,{query:{price:{"$gt":6}},out:"mr5"})


总结

   MongoDB中的MR工具非常强大,文中的例子只是基础实例.结合Sharding后,多服务器并行做数据集合处理,才能真正显现其能力.

   如果后续有时间,希望能总结和分享更多关于MongoDB,关于SQL Server的东西.

您可能感兴趣的文档:

--结束END--

本文标题: MongoDB:MapReduce基础及实例

本文链接: https://www.lsjlt.com/news/36473.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • MongoDB:MapReduce基础及实例
    背景     MapReduce是个非常灵活和强大的数据聚合工具。它的好处是可以把一个聚合任务分解为多个小的任务,分配到多服务器上并行处理。MongoDB也提供了Ma...
    99+
    2022-10-18
  • TypeScript枚举的基础知识及实例
    目录前言TypeScript 中的枚举是什么在 TypeScript 中使用枚举需要注意什么常见枚举的类型枚举反向映射计算枚举总结前言 枚举是受 TypeScript 支持的数据类型...
    99+
    2022-11-12
  • Java 基础之内部类详解及实例
     Java 基础之内部类详解及实例内部类不是很好理解,但说白了其实也就是一个类中还包含着另外一个类如同一个人是由大脑、肢体、器官等身体结果组成,而内部类相当于其中的某个器官之一,例如心脏:它也有自己的属性和行为(血液、跳动)显然,...
    99+
    2023-05-31
    java 内部类 ava
  • Python 基础之字符串string详解及实例
    Python字符串(string) 详解 及 代码 Python的字符串可以使用单引号('), 双引号("), 三引号('''); 三引号(''')里面, 可以添加单引号和双引号, 也可以通过转义序列()添...
    99+
    2022-06-04
    字符串 详解 实例
  • 详解MongoDB数据库基础操作及实例
    详解数据库基础操作及实例           废话不多说,直接上代码,注释写的比较清楚,大家参考下,  示...
    99+
    2022-10-18
  • java向下转型基础知识点及实例
    1、概念 向下转型就是父类对象转成子类对象。我们把一个父类引用 Animal类型的引用 给了一个 Bird类型 的引用,这就是向下转型 2、格式 子类 子类对象=(子类)父类实例 ...
    99+
    2022-11-12
  • java中Class类的基础知识点及实例
    1、说明 Class本身也是一个类。 Class对象只能由系统确定。 JVM中只有一个Class实例可以加载一个类。 Class对应于JVM中加载的.class文件。 每一类的实例都...
    99+
    2022-11-12
  • Nginx基础location语法及功能配置实例
    目录1.Nginx location1.1.location作用1.2.location语法1.3.location匹配示例1.4.location配置实例1.5.不用uri及特殊字...
    99+
    2022-11-13
  • Python基础——切片实例
    切片实例 L = list(range(100)) print(L, end=' ') [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, ...
    99+
    2023-01-30
    切片 实例 基础
  • HTML基础实例分析
    这篇“HTML基础实例分析”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“HTML基础实例分...
    99+
    2022-10-19
  • Python 正则表达式基础知识点及实例
    1. 什么是正则表达式 正则表达式(Regular Expressions),也称为 “regex” 或 “regexp” 是使用单个字符串来描述、匹配一系列匹配某个句法规则的字符...
    99+
    2022-11-12
  • Docker基础入门以及示例分析
    这篇文章将为大家详细讲解有关Docker基础入门以及示例分析,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。一. docker基础介绍  可能很多朋友对docker还停留在听说过,并没有认真关...
    99+
    2023-06-19
  • C及C++ 基础循环示例详解
    目录正文手动(通用)方法(迭代方法)使用循环 循环While 循环do-while 循环正文 在编程中,有时需要多次执行某些操作或(例如)n次。当我们需要重复执行一个语句块...
    99+
    2022-11-13
  • java局部变量表的基础知识点及实例
    说明 1、局部变量表也叫局部变量数组或本地变量表。定义为一个数组,主要用于存储方法参数和定义方法中的局部变量。这些数据类型包括各种基本数据类型、对象参考和returnAddress类...
    99+
    2022-11-12
  • JavaScript基础介绍与实例
    一、什么是JavaScript JavaScript是一种具有面向对象能力的、解释性的程序设计语言。更具体一点,它是基于对象和事件驱动并具有相对安全性的客户端脚本语言。因为他不需要在...
    99+
    2022-11-13
  • Python函数参数基础介绍及示例
    目录视频函数的参数位置参数默认参数默认参数陷阱视频 观看视频 函数的参数 定义函数时,我们把参数的名字和位置确定下来,函数的接口定义就完成了。参数在函数名后的括号内指定。您可以根据需...
    99+
    2022-11-11
  • PHP基础用法及phpinfo();的使用案例
    这篇文章给大家分享的是有关PHP基础用法及phpinfo();的使用案例的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。在这个abc.php文件中写入如下代码。<php phpinfo();&nbs...
    99+
    2023-06-22
  • python基础之 python实现PID算法及测试的例子
      PID算法实现  import time  class PID:  def __init__(self, P=0.2, I=0.0, D=0.0):  self.Kp = P  self.Ki = I  self.Kd = D  sel...
    99+
    2023-06-02
  • Python基础知识实例分析
    这篇文章主要介绍了Python基础知识实例分析的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇Python基础知识实例分析文章都会有所收获,下面我们一起来看看吧。在Python 语言中,对象是通过引用传递的。多元...
    99+
    2023-06-17
  • JQuery基础运用实例分析
    这篇文章主要介绍“JQuery基础运用实例分析”,在日常操作中,相信很多人在JQuery基础运用实例分析问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”JQuery基础运用实例...
    99+
    2022-10-19
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作