MongoDB MapReduce 使用(二)

用户消费行为分析(MapReduce实现,Hive分析) 一、题目要求 数据来自CDNow网站的一份用户购买CD明细,本数据集共有 6 万条 左右数据,数据为 CDNow 网站 1997年1月至1998年6月的用户行为 数据 阅读详情
一  MapReduce 在分片集合上的使用

      Map-reduce可以在分片集合上使用,而且可以将分片集合作为输入和输出。
      当一个分片集合作为其输入的时候,mongos进程会自动的向每个分片来分发map和reduce 作业,然后mongos进程会等待所有分片完成自己的作业。
      如果map reduce 的out字段上有sharded值的话,mongodb会将结果集合进行分片,并选择_id作为其片键。

二  编写MapReduce程序
    
       所有的map-reduce函数都是用JavaScript书写,然后在mongod实例进程上运行。
       Map-Reduce是进行大容量数据处理的范式,对于Map-Reduce操作,MongoDB提供了MapReduce的数据库命令。在进行map-reduce操作的时候,MongoDB会将满足查询条件的文档进行map所定义的操作,map函数会产生( emit)键值型的数据。
      如果某个键所对应的值有多个的话,会进行reduce的操作,最后将结果保存到一个集合中。通过定义一个finalize函数可以对reduce的结果做进一步的处理,比如:进行投影或者规范化输出、进一步的计算等。

看下面例子:
   1.首先在orders集合中插入5条待检索数据
  >db.order.insert({ "cust_id" : "1", "ord_date" : new Date("2013-11-13T16:00:00Z"), "status" : "A", "price" : 25, "items" : [ { "sku" : "mmm", "qty" : 5, "price" : 2.5 }, { "sku" : "nnn", "qty" : 5, "price" : 2.5 } ] })

>db.order.find()
{ "_id" : ObjectId("528312e716b20807b2152db5"), "cust_id" : "1", "ord_date" : ISODate("2013-11-13T16:00:00Z"), "status" : "A", "price" : 25, "items" : [      {      "sku" : "mmm",      "qty" : 5,      "price" : 2.5 },      {      "sku" : "nnn",      "qty" : 5,      "price" : 2.5 } ] }
{ "_id" : ObjectId("528312f716b20807b2152db6"), "cust_id" : "2", "ord_date" : ISODate("2013-11-13T16:00:00Z"), "status" : "A", "price" : 25, "items" : [      {      "sku" : "mmm",      "qty" : 5,      "price" : 2.5 },      {      "sku" : "nnn",      "qty" : 5,      "price" : 2.5 } ] }
{ "_id" : ObjectId("5283130816b20807b2152db7"), "cust_id" : "3", "ord_date" : ISODate("2013-11-13T16:00:00Z"), "status" : "A", "price" : 25, "items" : [      {      "sku" : "mmm",      "qty" : 5,      "price" : 2.5 },      {      "sku" : "nnn",      "qty" : 5,      "price" : 2.5 } ] }
{ "_id" : ObjectId("5283132c16b20807b2152db8"), "cust_id" : "3", "ord_date" : ISODate("2013-11-13T16:00:00Z"), "status" : "A", "price" : 30, "items" : [      {      "sku" : "mmm",      "qty" : 6,      "price" : 2.5 },      {      "sku" : "nnn",      "qty" : 6,      "price" : 2.5 } ] }
{ "_id" : ObjectId("5283134d16b20807b2152db9"), "cust_id" : "2", "ord_date" : ISODate("2013-11-13T16:00:00Z"), "status" : "A", "price" : 20, "items" : [      {      "sku" : "mmm",      "qty" : 4,      "price" : 2.5 },      {      "sku" : "nnn",      "qty" : 4,      "price" : 2.5 } ] }


  2.统计每个顾客消费总额
  a.编写map函数
 > var mapFunc = function() {
... emit(this.cust_id,this.price);
... };
  b.编写reduce函数
> var reduceFunc = function(key,values) {
... return Array.sum(values);
... };
c.执行mapreduce
> db.runCommand({mapreduce:'order',map:mapFunc,reduce:reduceFunc,out:{replace:'map_reduce_result'}})
{
     "result" : "map_reduce_result",
     "timeMillis" : 35,
     "counts" : {
          "input" : 5,
          "emit" : 5,
          "reduce" : 2,
          "output" : 3
     },
     "ok" : 1
}
也可以这样
> db.order.mapReduce(mapFunc,reduceFunc,{out:{replace:'map_result_result'}})
{
     "result" : "map_result_result",
     "timeMillis" : 19,
     "counts" : {
          "input" : 5,
          "emit" : 5,
          "reduce" : 2,
          "output" : 3
     },
     "ok" : 1,
}

 注意:db.XXXmapReduce是对数据库命令db.runCommand的一个包装,前者实际上是调用后者来实现的

d.查看结果
> show collections
map_reduce_result
order
system.indexes
> db.map_reduce_result.find()
{ "_id" : "1", "value" : 25 }
{ "_id" : "2", "value" : 45 }
{ "_id" : "3", "value" : 55 }


3.计算每种商品的购买总数和平均每次购买数量

a.编写map函数
> var mapFunc = 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);
...   }};
b.编写reduce函数
> var reduceFunc = function(key,values) {
...   
...    reduceVal = {count:0,qty:0};
...
...    for(var idx=0;idx<values.length;idx++) {
...    reduceVal.count += values[idx].count;
...     reduceVal.qty  += values[idx].qty;
...    }
...    return reduceVal;
...  };
c.编写finalize函数
> var finalizeFunc = function(key,reduceVal) {
…      reduce Val.avg = reduceVal.qty/reduceVal.count;
...      return reduceVal;
...   }
d.执行mapreduce函数
db.order.mapReduce(mapFunc,reduceFunc,
  {
     out:  {merge:"map_reduce_result_2"},
     query:{ ord_date:{$gt:new Date('01/01/2000')}},
     finalize:finalizeFunc
  }
)
{
     "result" : "map_reduce_result_2",
     "timeMillis" : 20,
     "counts" : {
          "input" : 5,
          "emit" : 10,
          "reduce" : 2,
          "output" : 2
     },
     "ok" : 1,
}
分析:
      从执行结果可以发现,有5个文档执行MapReduce的操作,Map操作发生了10次(每个文档产生了两次,印证了上一节所说的一个文档可以进行一次或多次Map操作),Reduce操作发生了2次,最终输出了2个文档。

同样也可以使用runCommand来执行MapReduce操作:
db.runCommand({mapreduce:'order’,
                                        map:mapFunc,
                                    reduce:reduceFunc,
                                          out:{replace:'map_reduce_result_2'},
                                      query:{ord_date:{$gt:new Date('01/01/2000')}},
                                    finalize:finalizeFunc})

d.查看结果
> db.map_reduce_result_2.find()
{ "_id" : "mmm", "value" : { "count" : 5, "qty" : 25, "avg" : 5 } }
{ "_id" : "nnn", "value" : { "count" : 5, "qty" : 25, "avg" : 5 } }


注意:
        1.reduce函数返回对象的键值结构必须要和map函数传出对象值的键值类型相同,这样才能保证多次调用Reduce 函数成为可能。否则,会出现奇怪的很难调试的错误。例如在第二个例子中reduce返回的对象的类型为 “ {count:0,qty:0}” ,它和map函数的传出对象的值类型是 “var value =  { count:1, qty:this.items[idx].qty }”类型是一致的。
        
         2.使用finalize函数可以进一步对Value的值进行操作,例如可以这样修改上面例子中的finalizeFunc:
      > var finalizeFunc = function(key,reduceVal) {
…      reduceVal.avg = reduceVal.qty/reduceVal.count;
…      reduceVal.tip   = “ MapReduce”;         
...      return reduceVal;
…   }
 此时的结果显示为:
> db.map_reduce_result_2.find()
{ "_id" : "mmm", "value" : { "count" : 5, "qty" : 25, "avg" : 5,”tip”: ”MapReduce" } }
{ "_id" : "nnn", "value" : { "count" : 5, "qty" : 25, "avg" : 5 ,”tip”: "MapReduce"} }
       
      3.进行MapReduce时可以使用qurey对文档进行过滤,只对过滤后的文档进行MapReduce操作,提高MapReduce 执行效率。

      4.如果map后的文档中的键只有一个值的时候,不会进行reduce 操作。

      5.Reduce 返回的值不能是一个数组,通常是一个对象或者一个数值。
     

三 总结

      只要理解MapReduce原理,了解MapReduce聚合过程,那么编写MapReduce函数也就没那么困难了。
     和聚管道相比,使用map-reduce提供了很大的灵活性,我们可以编写自己的逻辑map和reduce函数,实现特定的功能。但是一般来说,写map-reduce操作 比聚合管道要复杂,而且效率也没有聚合管道高。
    
    下面一节会详细介绍聚合管道的使用(Aggregation Pipeline )。
MapReduce实现账单统计 文章目录一、项目简介二、样例1. 样例输入2. 样例输出二、具体实现1. 引入maven依赖2. 随机生成数据3. Mapper类的编写4. Reducer类的编写5. Partitioner类的编写6. Driver类的编写7. 打包成jar文件并上传hadoop集群执行三、项目地址 一、项目简介 本项目主要通过采用MapReduce的java-api,对自己随机生成的消费账单(如适用于统计某宝的购买记录等)进行合并和统计操作,使得可以按年或按月查询每个用户的账单。并根据本项目实际情况设置了2个分区和2 阅读详情

相关推荐

Mongo入门:数据去重之MapReduce,Aggregation的简单使用(另附相关网络资源)

先附上两个很好用也常见的链接: - MongoDB 教程-RUNOOB - The MongoDB 3.4 Manual - 用通俗易懂的大白话讲解Map/Reduce原理(很通俗但是也很浅)。BackGround1. 需求:查询某个月某医生有出诊计划的日期。(在mongo中去重能减轻传输网络负担以及程序的计算量)Created with Raphaël 2.1.0MongoMongo程序程序

V_code的博客 5796

hadoop MapReduce计算总销售量,每个月的销售量,每个怕品牌的总销售量

今天来练习一下mapreduce的入门小知识点 准备数据如下截图 有IP xiaomi 华为三个手机品牌,在2019年中每个月每天都有销量 1 求三个品牌一年一共销售多少部手机 package com.sheng.hdfs; import java.io.IOException; import org.apache.hadoop.conf.Configuration; import or...

不言尘世 3657

告别DLTS的模糊地带:手把手教你用拉普拉斯深能级瞬态光谱(LDLTS)精准揪出半导体缺陷

本文详细介绍了拉普拉斯深能级瞬态光谱(LDLTS)技术在半导体缺陷检测中的高分辨率解决方案。相比传统DLTS,LDLTS通过拉普拉斯变换和正则化算法,将分辨率提升至1meV,有效解析复杂重叠缺陷谱,适用于硅、GaN等材料的精确缺陷分析。文章涵盖LDLTS原理、系统搭建、测量流程及工业应用案例,为半导体工艺优化提供强大工具。

weixin_29238147的博客 193

Mongodb中数据聚合之MapReduce

Mongodb是针对大数据量环境下诞生的用于保存大数据量的非关系型数据库,针对大量的数据,如何进行统计操作至关重要,那么如何从Mongodb中统计一些数据呢? 在Mongodb中,给我们提供了三种用于数据聚合的方式: (1)简单的用户聚合函数; (2)使用aggregate进行统计; (3)使用mapReduce进行统计; 今天我们首先来讲讲mapReduce是如何统计,在后续的文章中,

马靖的个人技术博客 9693

从‘炼丹’到‘讲理’:物理信息神经网络(PINN)的硬约束 vs 软约束,我该选哪个?

本文深入探讨了物理信息神经网络(PINN)中硬约束与软约束的选择策略,帮助研究者在深度学习中有效融入物理先验知识。通过对比两种约束方法的实现复杂度、数据效率和计算性能,提供了针对材料科学和流体动力学等领域的实用决策指南,并介绍了自适应约束和混合约束等前沿技术。

weixin_42535703的博客 527

EBS开发_创建AP付款

--以下代码于20181002在Tony环境测试通过 /* BEGIN   --mo_global.init('SQLAP');   apps.fnd_global.apps_initialize(user_id =&gt; 1110, resp_id =&gt; 50597, resp_appl_id =&gt; 20003);   --mo_global.set_policy_context(...

蜗牛先生快跑的博客 4767

mongodb的mapreduce实现分组统计数量

分组:test db.runCommand( { mapreduce : "test", map : function() { var nameKey = this.name; kws.forEach(function(kw){ var key = kw.key; if(nameKey.indexOf(key) =...

tydldd 921

fragstats:景观指数趋势分析

优快云@_养乐多_本文将介绍景观指数时间序列的趋势分析,包括趋势类型、斜率、截距等。以及景观指数突变分析所用的软件和 python 代码。结果如下图所示,

养乐多的博客 2860

mongodb sum 操作

Mongodb 统计某个字段的和,可以使用聚合函数。 数据结构如下: &gt; db.message.findOne() { "_class" : "com.cyou.appwiki.bean.Message", "_id" : ObjectId("53997f80c451bf833288b882"), "content" : "power9li的回答2",

garyli 2014

泛微OA提交流程到下一个节点

泛微OA后端接口强制流程归档

CXYCMY的博客 2247

YOLOv11模型改进-模块-引入空间池化模块StripPooling 解决遮挡、小目标

本文介绍了一种新的空间池化策略,称为,用于场景解析。结构:包括两个平行路径,分别进行水平和垂直方向的条带池化,然后通过1D卷积层进行特征调整。:结合了条带池化和传统的空间池化,分别用于捕捉长距离和短距离的依赖关系。作用捕捉长距离依赖:通过长条形的池化窗口,有效捕捉分布离散的区域之间的关系。避免不相关信息干扰:窄条形的池化窗口有助于捕捉局部上下文,防止不相关区域干扰标签预测。提高场景解析性能:在多个基准数据集上,证明了这种方法能够显著提升场景解析的效果。

qq_64693987的博客 4205

mongodb group 有条件的过滤组合个数。

1.统计个数,这种方式比较快。 db.trace_2015_01_01.aggregate([{ $match : { _id:{ "$gt":3309432 } } },{$group : {_id : "$operate", num_tutorial : {$sum : 1}}}]); 2.这种方式是mapreduce的方式,很慢 db.trace_2015_01_01.group({

Terry - 专注外贸B2C 3921

爆肝5万字❤️Open3D 点云数据处理基础(Python版)

本文为Open3D 点云数据处理基础教程(Python版),小白也能轻松上手!还等什么呢,学起来!

孙悟空 13万+

mongodb中mapreduce的使用以及使用pymongo调用mapreduce

先简单介绍一下map/reduce map函数:接受一个键值对(key-value pair),产生一组中间键值对。MapReduce框架会将map函数产生的中间键值对里键相同的值传递给一个reduce函数。 reduce函数:接受一个键,以及相关的一组值,将这组值进行合并产生一组规模更小的值(通常只有一个或零个值)。 mongodb直接调用mapreduce不是本文重点,因此引述网

Andos's House 4530

图像处理 | 基于matlab的多尺度Retinex(MSR)和自适应直方图均衡化(CLAHE)算法联合的低照度图像增强(附代码)

本文介绍了一种基于多尺度Retinex(MSR)和CLAHE的低照度图像增强算法。算法首先对图像进行多尺度Retinex处理,通过不同尺度的高斯核去除光照影响;然后采用CLAHE算法进行对比度增强。Matlab实现展示了算法流程,包含灰度转换、多尺度Retinex增强和CLAHE处理。实验结果显示,该方法能有效提升低照度图像的可见性,增强细节表现。最后提出了改进建议,包括引入深度学习方法和优化参数选择。

尘世冰封的专栏 952

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

MongoDB中MapReduce使用

又是一年求职季,在这里,我为各位准备了一套Java程序员精选高频面试笔试真题,来帮助大家攻下BAT的offer,题目范围从初级的Java基础到高级的分布式架构等等一系列的面试题和答案,用于给大家作为参考以下是部分内容截图“_id” : “曹雪芹”,“author” : “曹雪芹”,“books” : “红楼梦”,“_id” : “钱钟书”,“author” : “钱钟书”,“books” : “宋诗选注,–haha–,谈艺录”,

2401_85117728的博客 1056

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

一篇文章带你搞定 MongoDB 中 MapReduce 使用

玩过 Hadoop 的小伙伴对 MapReduce 应该不陌生,MapReduce 的强大且灵活,它可以将一个大问题分解为多个小问题,将各个小问题发送到不同的机器上去处理,所有的机器都完成计算后,再将计算结果合并为一个完整的解决方案,这就是所谓的分布式计算。此处我们就来看看 MongoDB 中 MapReduce 的使用。 文章目录一、mapReduce二、runCommand 实现 一、mapReduce MongoDB 中的 MapReduce 可以用来实现更复杂的聚合命令,使用 MapReduce 主

南淮北安的博客 3488

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

MongoDB 聚合操作之 MapReduce 使用

MongoDB Map Reduce 前面介绍了一些 MongoDB 的聚合操作,这里介绍下 MapReduce 的相关内容。 Map-Reduce 是一种计算模型,简单的说就是将大批量的工作(数据)分解(MAP)执行,然后再将结果合并成最终结果(REDUCE)。 MongoDB 提供的 Map-Reduce 非常灵活,对于大规模数据分析也相当实用。 Map-Reduce 的解释 M...

Wayfreem的博客 1675

MongoDB教程(十八):MongoDB MapReduce

MongoDB 的 MapReduce 是一种强大的工具,用于处理大规模数据集并从中提取有价值的信息。MapReduce 的概念源自 Google 的论文,后来被 Hadoop 和其他大数据处理框架所采纳。在 MongoDB 中,MapReduce 提供了一种灵活的方式对集合中的数据进行聚合和分析。本文将深入探讨 MapReduce 的工作原理,并通过具体的案例代码来演示其使用方法。

菜鸟小码的博客 1369

MongoDB:MapReduce的使用

MongoDB:MapReduce的使用

拒绝熬夜啊的博客 1550

使用MongoDB的MapReduce

MapReduce是Google在2004年推出的一种软件框架,用于支持对计算机集群中的大数据集进行分布式计算。 您可以从此处阅读有关MapReduce的信息 。 MongoDB是用C ++编写的面向开源文档的NoSQL数据库系统。 您可以从此处阅读有关MongoDB的更多信息。 1.安装MangoDB。 请遵循此处提供的MongoDB官方文档中的说明。 就我而言,我遵循了OS X...

最佳 Java 编程 378

MongoDB中的MapReduce详解

MongoDB作为一种流行的NoSQL数据库,提供了多种数据处理和分析的方式,其中MapReduce是一种强大的工具,用于处理大规模数据集。在MongoDB中,MapReduce可以使用JavaScript编写的Map和Reduce函数来处理集合中的数据。例如,可以对每个文档生成一个键值对,键是某个字段的值,值是文档的计数。例如,可以将相同键的值加起来,计算总数。:MapReduce提供了强大的数据处理能力,用户可以根据需要自定义Map和Reduce函数,处理复杂的数据聚合和分析任务。

My_wife_QBL的博客 1415

MongoDB MapReduce 深入解析

在处理大规模数据集时,尤其是在MongoDB这样的NoSQL数据库中,我们常常会遇到需要对数据进行复杂查询和聚合操作的需求。例如,假设我们有一个包含用户购买记录的数据库集合,我们需要统计每个用户的总消费金额以及消费次数。这样的操作如果使用传统的查询方法可能会非常复杂,且效率低下。这时,MapReduce作为一种强大的数据处理工具,就能发挥其优势。MapReduce在MongoDB中扮演着至关重要的角色,它允许我们以分布式的方式处理数据,从而提高处理速度和效率。

我是Java程序员廖志伟,感谢朋友们的支持!不定期贡献一篇高品质、过万文字、图文并茂且附有视频解说、满载代码示例注释的良心之作,坚决杜绝粗制乱造。 896

MongoDB MapReduce介绍

1、概述 MongoDB中的MapReduce相当于关系数据库中的group by。

残缺的孤独 2万+

mongodb中使用mapreduce

本文主要讲怎么在mongodb中使用mapreduce,而不涉及Spring与Mongodb整合等内容,如想了解这些,请参考我的其它文章。 这个例子主要目的是:统计每个名字有多少人重名。 import org.springframework.context.ApplicationContext; import org.springframework.context.support.FileSy

提炼技能,形成智慧 1932

MongoDB MapReduce

一  Map/Reduce简介            MapReduce 是目前最流行和被普遍研究的海量数据处理方法。它是Google公司的核心模型,用于大规模数据集(大于1TB)的并行计算。“映射(Map)”与“化简(Reduce)”的概念是它们的主要思想,都是从函数式编程语言借来的。MapReduce将负责的运行于大规模集群上的并行计算过程高度地抽象为两个函数(Map和Reduce

huangchao的专栏 1199
上一篇: MongoDB MapReduce 使用(一)
下一篇: MongoDB 聚合管道(二)(Aggregation Pipeline)
张哲BJUT
博客等级 码龄15年 151粉丝 111原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值