• 需求说明

用Map&Reduce计算几个班级中,每个班级10岁和20岁之间学生的数量:

  • 需求分析

  • 学生表的字段:

db.students.insert({classid:1, age:14, name:'Tom'})

将classid随机1和2、age在8-25岁之间随机,name在3-7个字符之间随机。

  • 数据写入

  • 数据写入java脚本

往mrtask库中students写入1000万条数据:


package org.test;

import java.util.ArrayList;

import java.util.List;

import java.util.Random;

import com.mongodb.BasicDBObject;

import com.mongodb.DB;

import com.mongodb.DBCollection;

import com.mongodb.DBCursor;

import com.mongodb.DBObject;

import com.mongodb.MongoClient;

import com.mongodb.ServerAddress;

public class TestMongoDBReplSet {

    public static void main(String[] args) {

        try {

            List<ServerAddress> addresses = new ArrayList<ServerAddress>();

            ServerAddress address1 = new ServerAddress("172.16.16.89", 27017);

            addresses.add(address1);

            MongoClient client = new MongoClient(addresses);

            DB db = client.getDB("mrtask");

            DBCollection coll = db.getCollection("students");

            // 数据写入

            BasicDBObject object = new BasicDBObject();

            for (int i = 1; i <= 10000000; i++) {

                object.append("classid", 1 + (int) (Math.random() * 2));

                object.append("age", 8 + (int) (Math.random() * 17));

                object.append("name", getName());

                coll.insert(object);

                object.clear();

            }

        } catch (Exception e) {

            e.printStackTrace();

        }

    }

    public static String getName() {

        ArrayList list = new ArrayList();

        for (char c = 'a'; c <= 'z'; c++) {

            list.add(c);

        }

        String str = "";

        int end = 3 + (int) (Math.random() * 4);

        for (int i = 0; i < end; i++) {

            int num = (int) (Math.random() * 26);

            str = str + list.get(num);

        }

        return str;

    }

}

  

  • 查看数据写入

经查看,mrtask库中students表中有1000万条的数据:

[root@localhost bin]# ./mongo

MongoDB shell version: 2.6.11

connecting to: test

> show dbs

admin   (empty)

local   0.078GB

mrtask  3.952GB

test    0.453GB

> use mrtask

switched to db mrtask

> db.students.find().count()

10000000

  • Map&Reduce计算

  • Map计算

> mapfun = function(){emit(this.classid,1)}

  • Reduce计算

> reducefun=function (key, values) { var count = 0; values.forEach(function (v) {count += v;}); return count; }

> ff = function (key, value) { return {classid:key, count:value}; }

  • Result输出

> classid_res = db.runCommand({

mapreduce:"students",

map:mapfun,

reduce:reducefun,

out:"students_classid_res",

finalize:ff,

query:{age:{$gt:10,$lt:20}}

});

  • 计算结果

> db.students_classid_res.find()

{ "_id" : 1, "value" : { "classid" : 1, "count" : 2643128 } }

{ "_id" : 2, "value" : { "classid" : 2, "count" : 2650870 } }

记一次MongoDB Map&Reduce入门操作的更多相关文章

  1. MongoDB Map Reduce(转载)

    MongoDB Map Reduce Map-Reduce是一种计算模型,简单的说就是将大批量的工作(数据)分解(MAP)执行,然后再将结果合并成最终结果(REDUCE). MongoDB提供的Map ...

  2. mongodb Map/reduce测试代码

    private void AccountInfo() { ls.Clear(); DateTime dt = DateTime.Now.Date; IMongoQuery query = Query& ...

  3. MongoDB Map Reduce

    介绍 Map-Reduce是一种计算模型,简单的说就是将大批量的工作分解(MAP)执行,然后再将结果合并成最终结果(REDUCE). MongoDB提供的Map-Reduce非常灵活,对于大规模数据分 ...

  4. 003-Tuple、Array、Map与文件操作入门实战

    003-Tuple.Array.Map与文件操作入门实战 Tuple 各个元素可以类型不同 注意索引的方式 下标从1开始 灵活 Array 注意for循环的until用法 数组的索引方式 上面的for ...

  5. 入门大数据---Map/Reduce,Yarn是什么?

    简单概括:Map/Reduce是分布式离线处理的一个框架. Yarn是Map/Reduce中的一个资源管理器. 一.图形说明下Map/Reduce结构: 官方示意图: 另外还可以参考这个: 流程介绍: ...

  6. 【MongoDB初识】-其他操作

    又发现一种查询写法$wheredb.class.find({$}}) 排重db.class.distinct("stuCount") 一.MapReduce(摘录MongoDB实战 ...

  7. [转]MongoDB学习 C#驱动操作MongoDB

    下载驱动 驱动的下载有两种方式:一种是在C#项目中通过NuGet进行安装,另一种是通过下面的链接:https://github.com/mongodb/mongo-csharp-driver/rele ...

  8. MongoDB学习笔记——聚合操作之MapReduce

    MapReduce MongoDB中的MapReduce相当于关系数据库中的group by.使用MapReduce要实现两个函数Map和Reduce函数.Map函数调用emit(key,value) ...

  9. MongoDB之三(高级操作 聚合、游标)

    一: 聚合 常见的聚合操作跟sql server一样,有:count,distinct,group,mapReduce. <1> count count是最简单,最容易,也是最常用的聚合工 ...

随机推荐

  1. myeclipse中导入的js文件报错(出现红叉叉,提示语法错误)

    为了做一个页面特效,导入了一个jquery文件,怎想,myeclipse竟然报错说是语法错误,但是这个js文件我是从官网上下载的,不应该出错才对,百度谷歌之后终于找到了解决办法: 选中报错的js文件, ...

  2. python signal信号

    作用:发送和接收异步系统信号 信号是一个操作系统特性,它提供了一个途径可以通知程序发生了一个事件并异步处理这个事件.信号可以由系统本身生成,也可以从一个进程发送到另一个进程. 由于信号会中断程序的正常 ...

  3. GitHub上新建或删除仓库Repository

    一:新建仓库 在首页的New Repository,点击进入页面,输入和项目同名的仓库名就可以了.

  4. HDU 5703 Desert 水题 找规律

    已知有n个单位的水,问有几种方式把这些水喝完,每天至少喝1个单位的水,而且每天喝的水的单位为整数.看上去挺复杂要跑循环,但其实上,列举几种情况之后就会发现是找规律的题了= =都是2的n-1次方,而且这 ...

  5. Java --HashMap源码解析

    兴趣所致研究一下HashMap的源码,写下自己的理解,基于JDK1.8. 本文大概分析HashMap的put(),get(),resize()三个方法. 首先让我们来看看put()方法. public ...

  6. 【再探backbone 02】集合-Collection

    前言 昨天我们一起学习了backbone的model,我个人对backbone的熟悉程度提高了,但是也发现一个严重的问题!!! 我平时压根没有用到model这块的东西,事实上我只用到了view,所以昨 ...

  7. 【javascript激增的思考02】模块化与MVC

    前言 之前我们遇到了这么一个项目,也就是我们昨天提到的,有很多的小窗口的,昨天说的太抽象了,今天我们再来理一理什么是小窗口(后面点说下),当时由于js有一点复杂,我自己也装B跟风用了一下传说中MVC! ...

  8. Delphi 时间耗时统计

    处理事情: 数据处理过程中,速度很慢,无法准确定位分析是DB问题还是客户端处理问题,所以增加计时统计日志: Delphi计时首次使用,查阅资料,予以记录: var BgPoint, EdPoind: ...

  9. ARP投毒及其防御方法

    1.攻击原理 ARP欺骗就是中间人欺骗pc机,告诉pc机它是服务器.再欺骗服务器,告诉服务器它就是pc机.以致获取服务器与pc机的会话信息. 中间人欺骗服务器时,会给服务器发一个报文,发之前把报文中的 ...

  10. ftp安全设置

    1.文件介绍 /etc/pam.d/vsftpd中ftpuser.user_list文件说明:(在file=后添加改文件路径)/etc/vsftpd.conf中userlist_enable.user ...