设为首页 收藏本站
查看: 1405|回复: 0

[经验分享] mongodb mapredReduce 多个条件分组(group by)

[复制链接]

尚未签到

发表于 2017-12-16 09:36:34 | 显示全部楼层 |阅读模式
  from:https://my.oschina.net/chiyong/blog/289138
  Mongodb 没有传统数据库的group函数,如果分组需要走MapReduce。这种MR与HadoopMR类似。下面看看Mongodb 的分组实现
  现在又一张 表它的数据格式如下:
  {
  "_id" : ObjectId("53b224e0a1ae72328a57702c"),
  "title" : "SECJ0118E",
  "criteria" : "未找到对应的错误码",
  "actual" : "1",
  "effect" : "可能引起重大问题",
  "suggestion" : "请专家提供意见",
  "severity" : "Normal",
  "status" : "NotOK",
  "rtype" : "FormLoginExte",
  "comment" : "[8/2/12 17:28:21:231 GMT+08:00] 0000001e FormLoginExte E SECJ0118E: Authentication error during authentication for user rpt",
  "category" : "logs",
  "time" : "0008-02-12 17:28:21"
  }
  {
  "_id" : ObjectId("53b224e0a1ae72328a577052"),
  "title" : "",
  "criteria" : "未找到对应的错误码",
  "actual" : "1",
  "effect" : "可能引起重大问题",
  "suggestion" : "请专家提供意见",
  "severity" : "Normal",
  "status" : "NotOK",
  "rtype" : "servlet",
  "comment" : "[8/2/12 19:04:41:891 CST] 0000000b servlet E com.ibm.ws.webcontainer.servlet.ServletWrapper init Uncaught.init.exception.thrown.by.servlet",
  "category" : "logs",
  "time" : "0008-02-12 19:04:41"
  }
  {
  "_id" : ObjectId("53b224e0a1ae72328a576fdc"),
  "title" : "系统资源设置[processes]",
  "criteria" : "unlimited",
  "actual" : "unlimited",
  "effect" : "如果对用户资源做了limits限制,有可能造成应用运行失败或系统性能下降。",
  "suggestion" : "建议修改/etc/security/limits,编辑root相关参数部分都为-1。",
  "severity" : "None",
  "status" : "OK",
  "rtype" : "系统参数设置检查",
  "comment" : "",
  "category" : "params"
  }
  1:单个条件分组
  (1) 现在我们根据title进行分组 并且统计每个组的数量
  db.runCommand({ mapreduce: "check_result",
  map : function Map() {
  //emit 函数中的key是唯一的,是分组条件 这里把title传递过来。
  emit(
  this.title,
  {count: 1}
  );
  },
  reduce : function Reduce(key, values) {
  total=0;//定义一个变量total , values是一个数组
  for( var i in values){
  total +=values.count
  }
  return {"count":total};
  },
  finalize : function Finalize(key, reduced) {
  return reduced;
  },
  out : { inline : 1 }
  });
  结果如下(结果中的_id键就是要分组的title 。value是分组后的值):
  { "_id" : "" , "value" : { "count" : 113.0}}
  { "_id" : "/tmp是否设置了t标志位" , "value" : { "count" : 21.0}}
  { "_id" : "ASYN0080W" , "value" : { "count" : 120.0}}
  { "_id" : "AppServer的JVM堆最大值" , "value" : { "count" : 6.0}}
  { "_id" : "AppServer的JVM堆最小值" , "value" : { "count" : 6.0}}
  { "_id" : "AppServer的JVM标准输出日志切换周期" , "value" : { "count" : 6.0}}
  { "_id" : "AppServer的JVM标准输出日志回滚类型" , "value" : { "count" : 6.0}}
  { "_id" : "AppServer的JVM标准错误日志切换周期" , "value" : { "count" : 6.0}}
  { "_id" : "AppServer的JVM标准错误日志回滚类型" , "value" : { "count" : 6.0}}
  { "_id" : "AppServer的WebContainer线程池最大值" , "value" : { "count" : 6.0}}
  { "_id" : "AppServer的WebContainer线程池最小值" , "value" : { "count" : 6.0}}
  { "_id" : "AppServer的通用JVM参数" , "value" : { "count" : 6.0}}
  { "_id" : "AppServer的通用JVM参数-SystemGC" , "value" : { "count" : 6.0}}
  { "_id" : "Audit是否打开" , "value" : { "count" : 21.0}}
  { "_id" : "CWPKI0041W" , "value" : { "count" : 65.0}}
  { "_id" : "CWPMC0017W" , "value" : { "count" : 7.0}}
  { "_id" : "CWSAA0037W" , "value" : { "count" : 13.0}}
  { "_id" : "Could not invoke an operation on object" , "value" : { "count" : 21.0}}
  { "_id" : "DCSV0000W" , "value" : { "count" : 4.0}}
  { "_id" : "DCSV1115W" , "value" : { "count" : 137.0}}
  2:多个条件分组
  (1) 现在我们根据title,status,severity进行分组 并且统计每个组的数量
  db.runCommand({ mapreduce: "check_result",
  map : function Map() {
  //emit 函数中的key是唯一的,是分组条件
  emit(
  {"title":this.title,"status":this.status,"serverity":this.severity}
  ,
  {count: 1}
  );
  },
  reduce : function Reduce(key, values) {
  total=0;//定义一个变量total , values是一个数组
  for( var i in values){
  total +=values.count
  }
  return {"count":total};
  },
  finalize : function Finalize(key, reduced) {
  return reduced;
  },
  out : { inline : 1 }
  });
  输出结果如下格式化:
  { "_id" : { "title" : "" , "status" : "NotOK"} , "value" : { "count" : 113.0}}
  { "_id" : { "title" : "/tmp是否设置了t标志位" , "status" : "NotOK"} , "value" : { "count" : 21.0}}
  { "_id" : { "title" : "ASYN0080W" , "status" : "NotOK"} , "value" : { "count" : 120.0}}
  { "_id" : { "title" : "AppServer的JVM堆最大值" , "status" : "NotOK"} , "value" : { "count" : 6.0}}
  { "_id" : { "title" : "AppServer的JVM堆最小值" , "status" : "NotOK"} , "value" : { "count" : 6.0}}
  { "_id" : { "title" : "AppServer的JVM标准输出日志切换周期" , "status" : "NotOK"} , "value" : { "count" : 6.0}}
  { "_id" : { "title" : "AppServer的JVM标准输出日志回滚类型" , "status" : "NotOK"} , "value" : { "count" : 6.0}}
  { "_id" : { "title" : "AppServer的JVM标准错误日志切换周期" , "status" : "NotOK"} , "value" : { "count" : 6.0}}
  { "_id" : { "title" : "AppServer的JVM标准错误日志回滚类型" , "status" : "NotOK"} , "value" : { "count" : 6.0}}
  { "_id" : { "title" : "AppServer的WebContainer线程池最大值" , "status" : "NotOK"} , "value" : { "count" : 6.0}}
  { "_id" : { "title" : "AppServer的WebContainer线程池最小值" , "status" : "NotOK"} , "value" : { "count" : 6.0}}
  { "_id" : { "title" : "AppServer的通用JVM参数" , "status" : "NotOK"} , "value" : { "count" : 6.0}}
  { "_id" : { "title" : "AppServer的通用JVM参数-SystemGC" , "status" : "NotOK"} , "value" : { "count" : 6.0}}
  { "_id" : { "title" : "Audit是否打开" , "status" : "NotOK"} , "value" : { "count" : 21.0}}
  { "_id" : { "title" : "CWPKI0041W" , "status" : "NotOK"} , "value" : { "count" : 65.0}}
  { "_id" : { "title" : "CWPMC0017W" , "status" : "NotOK"} , "value" : { "count" : 7.0}}
  { "_id" : { "title" : "CWSAA0037W" , "status" : "NotOK"} , "value" : { "count" : 13.0}}
  { "_id" : { "title" : "Could not invoke an operation on object" , "status" : "NotOK"} , "value" : { "count" : 21.0}}
  { "_id" : { "title" : "DCSV0000W" , "status" : "NotOK"} , "value" : { "count" : 4.0}}
  { "_id" : { "title" : "DCSV1115W" , "status" : "NotOK"} , "value" : { "count" : 137.0}}

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-424619-1-1.html 上篇帖子: MongoDB 副本集和C#交互,简单测试 下篇帖子: windows下MongoDB的安装及配置
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表