mongodb~mapreduce的实现特殊逻辑的统计
map reduce的解释
这是一张来自mongodb-mapreduce图示,比较能说明问题

其实我们可以从word count这个实例来理解MapReduce。MapReduce大体上分为六个步骤:input, split, map, shuffle, reduce, output。细节描述如下:
- 输入(input):如给定一个文档,包含如下四行:
Hello Java
Hello C
Hello Java
Hello C++ - 拆分(split):将上述文档中每一行的内容转换为key-value对,即:
0 - Hello Java
1 - Hello C
2 – Hello Java
3 - Hello C++ - 映射(map):将拆分之后的内容转换成新的key-value对,即:
(Hello , 1)
(Java , 1)
(Hello , 1)
(C , 1)
(Hello , 1)
(Java , 1)
(Hello , 1)
(C++ , 1) - 派发(shuffle):将key相同的扔到一起去,即:
(Hello , 1)
(Hello , 1)
(Hello , 1)
(Hello , 1)
(Java , 1)
(Java , 1)
(C , 1)
(C++ , 1)
注意:这一步需要移动数据,原来的数据可能在不同的datanode上,这一步过后,相同key的数据会被移动到同一台机器上。最终,它会返回一个list包含各种k-value对,即:
{ Hello: 1,1,1,1}
{Java: 1,1}
{C: 1}
{C++: 1} - 缩减(reduce):把同一个key的结果加在一起。如:
(Hello , 4)
(Java , 2)
(C , 1)
(C++,1) - 输出(output): 输出缩减之后的所有结果。
{
"_id" : ObjectId("5a79391534cdbd692825e978"),
"cdn" : "Conversant",
"domain" : "7img1.xxxx.com",
"status_code" : {
"200" : 80,
"206" : 3,
"404" : 2,
"304" : 4
}
}
使用下面语句对status_code各种key进行统计
db.getCollection('log_coll').mapReduce(
function(){
var codes = this.status_code;
Object.keys(codes).forEach(function(k){
emit(k, codes[k]);
})
},
function(k, v){
return Array.sum(v);
},
{
out : {inline : 1},
query: {}
}
)
也可以只显示状态为200的条目
db.getCollection('log_coll').mapReduce(
function(){
var codes = this.status_code;
Object.keys(codes).forEach(function(k){
if(codes[k].id=="200"){
emit(k, codes[k]);
}
})
},
function(k, v){
return Array.sum(v);
},
{
out : {inline : 1},
query: {}
}
)
多级对象如果判断各级对象是否存在
db.getCollection('client_accounts').mapReduce(
function(){
if(this.client!=undefined){
if(this.client.employees!=undefined) {
var codes = this.client.employees;
Object.keys(codes).forEach(function(k){
emit(k, codes[k]);
})
}
}
},
function(k, v){
},
{
out : {inline : 1},
query: {}
}
)
下面看多条件分组的mapreduce实现
我将多个条件拼接在一起方便查看,正式环境时可以使用js对象。
db.customerWorkloadTotal.mapReduce(
function() {
emit(this.salespersonId + "_" + this.customerId, this);
},
function(key, values) {
tagIntention = 0;
signCustomerNums = 0;
trackContactNums = 0;
values.forEach(function(v) {
if (v.tagIntention > 0) {
tagIntention = v.tagIntention;
}
if (v.signCustomerNums > 0) {
signCustomerNums = 1;
}
if (v.trackContactNums > 0) {
trackContactNums = 1;
}
});
return { "tagIntention": tagIntention, "signCustomerNums": signCustomerNums, "trackContactNums": trackContactNums };
},
{
query: { totalDate: { $gte: "2018-10-31" } },
sort: { totalDate: -1 },
out: { inline: 1 }
}
).find()
mongodb~mapreduce的实现特殊逻辑的统计的更多相关文章
- mongodb mapreduce使用总结
文章来自本人个人博客: mongodb mapreduce使用总结 大家都知道,mongodb是一个非关系型数据库.也就是说.mongodb数据库中的每张表是独立存在的,表与表之间没有不论什么依赖 ...
- MongoDB MapReduce(转)
MapReduce MapReduce是一种计算模型,简单的说就是将大批量的工作(数据)分解(MAP)执行,然后再将结果合并成最终结果(REDUCE).这样做的好处是可以在任务被分解后,可以通过大量机 ...
- MongoDB MapReduce学习笔记
http://cnodejs.org/topic/51a8a9ed555d34c67831fb8b http://garyli.iteye.com/blog/2079158 MapReduce应该算是 ...
- 用C#感受MongoDB MapReduce之魅力 转
MapReduce这个名词随着hadoop的用户的增多,越来越被人关注.MapReduce可谓MongoDB之中的亮点,我也想深入了解MapReduce,加上MongoDB操作简单,所以就选择了它.M ...
- MongoDB MapReduce用法简介
Map-Reduce部分:Map-Reduce相当于关系型数据库中的group by,主要用于统计数据之用.MongoDB提供的Map-Reduce非常灵活,对于大规模数据分析也相当实用. 语法 db ...
- MongoDB:MapReduce基础及实例
背景 MapReduce是个非常灵活和强大的数据聚合工具.它的好处是可以把一个聚合任务分解为多个小的任务,分配到多服务器上并行处理. MongoDB也提供了MapReduce,当然查询语肯定是Java ...
- E QUERY [main] SyntaxError: identifier starts immediately after numeric literal mongodb mapReduce 异常分析 集合命名规范
异常信息 repl_test:PRIMARY> db.0917order_totals_b.find()2018-09-28T15:13:03.992+0800 E QUERY [main] S ...
- [MongoDB]mapReduce
摘要 上篇文章介绍了count,group,distinct几个简单的聚合操作,其中,group比较麻烦一点.本篇文章将学习mapReduce的相关内容. 相关文章 [MongoDB]入门操作 [Mo ...
- 关于MongoDB时间格式转换和时间段聚合统计的用法总结
一 . 背景需求 在日常的业务需求中,我们往往会根据时间段来统计数据.例如,统计每小时的下单量:每天的库存变化,这类信息数据对运营管理很重要. 这类数据统计依赖于各个时间维度,年月日.时分秒都有可能. ...
随机推荐
- PHP命名空间与自动加载类详解
本文实例讲述了PHP命名空间与自动加载类.分享给大家供大家参考,具体如下: 今天我要给大家介绍的是PHP的命名空间 和 自动加载类 我先简单的分开演示 在放在一起 大家请看:什么是自动加载类? 想必大 ...
- 微信获取ticket及生成二维码(临时或永久)
微信获取ticket及生成二维码(临时或永久) curl.php---- define("APPID",""); define("APPSECRET& ...
- HTTP 报文格式
(a)GET,POST,PUT(更新)DELETE(删除) 首行中,请求报文只需包含路由,因为在发送请求前,tcp连接已经创建,协议版本 Header: 接收类型 (b)版本 + 状态码 Header ...
- VB输出数据到EXCEL
Private Sub Command1_Click() Dim i As Long Dim j As Long , ) As Long Dim xlApp, WS, WB Set xlApp = C ...
- window7环境下ZooKeeper的安装及运行
简介 ZooKeeper是一个分布式的,开放源码的分布式应用程序协调服务,是Google的Chubby一个开源的实现,是Hadoop和Hbase的重要组件.它是一个为分布式应用提供一致性服务的软件,提 ...
- WPF实现只打开一个窗口,并且重复打开时已经打开的窗口置顶
内容来自:https://codereview.stackexchange.com/questions/20871/single-instance-wpf-application 第一步:添加Syst ...
- Vue取消eslint语法限制
话不多说,先上图: 当然,这里的警告我是知道怎么回事,原来eslint是一个语法检查工具,但是限制很严格,在我的vue文件里面很多空格都会导致红线警告(可以屏蔽),虽然可以屏蔽,但是在编译的时候老是会 ...
- LoadRunner(三)——LR相关概念&组成部分
参考学习感谢:<精通软件性能测试与LoadRunner实战> 一.运行机制和主要组成部分 1.LoadRunner主要由VuGen.Controller和Analysis三部分构成: 2. ...
- sqlite3数据库教程
1.sqlite3安装(命令行): sudo apt-get install sqlite3 2.图形界面查看工具安装: sudo apt-get install sqlitebrowser 3.命令 ...
- 将选中的物体写入XML文件
using System.Collections;using System.Collections.Generic;using System.Xml.Linq;using UnityEditor;us ...