用MongoDB实现MapReduce
来源:http://blog.csdn.net/star_zongke/article/details/7475455
MapReduce 是 Google 在 2004 年发布的一个软件框架,用于支持大规模数据的分布式计算,详情请看这里。
MongoDB 是一个开源的面向文档的 NoSQL 数据库系统,使用 C++ 编写,详情请看这里。
1. 安装 MangoDB
首先请按照官方这个文档安装 MongoDB 数据库,在本文中,我们是在 Mac OS X 下安装并测试无误。
我使用 sudo port install mongodb 命令来安装 MongoDB ,唯一碰到的一个问题是 xcode 的版本问题,升级到 xcode 的最新版本就好了。
2. 运行 MongoDB
启动 MongoDB 是很简单的,只需要在终端窗口中执行 mogod 即可。
默认 MongoDB 是运行在 27017 端口上,使用 /data/db 作为默认目录来存放数据(我们已经在第一步就创建了这个目录)
如果你修改这些默认的配置,你可以通过命令行参数来进行修改:
mongod --port [your_port] --dbpath [your_db_file_path]
你需要确认的是数据目录必须已经存在并且在 mongodb 首次启动时该目录下没有其他文件。
3. 启动 MongoDB 交互环境
我们可以启动 MongoDB 交互环境来连接到 MongoDB 服务器,并在命令行中直接运行 MongoDB 命令。
在同一台机器上,你只需要简单的执行 mongo 就可以进入交互环境,如果想要连接不同机器上的 MongoDB 服务器,你可以使用下面的参数来指定目标服务器的IP地址和端口:
mongo [ip_address]:[port]
例如 : mongo localhost:4000
4. 创建数据库
接下来在交互环境中执行下面命令来创建数据库:
use library
上述命令创建了一个名为 library 的数据库。
然后我们可以通过下面的命令来查看刚创建的数据库,下面命令列出系统中所有的数据库:
show dbs;
你会注意到,你刚创建的数据库并没有列出来,这是因为 MongoDB 只有在需要的时候才会创建数据库,因此你需要往数据库里添加点数据。
5. 往数据库中插入数据
首先我们通过以下命令创建两本书:
> book1 = {name : "Understanding JAVA", pages : 100}
> book2 = {name : "Understanding JSON", pages : 200}
然后将这两本书保持到名为 books 的集合中:
> db.books.save(book1)
> db.books.save(book2)
上述命令将在 library 数据库中创建一个名为 books 的集合(也就是SQL数据库中的表),下面命令将列出我们刚添加的两本书:
> db.books.find();
{ "_id" : ObjectId("4f365b1ed6d9d6de7c7ae4b1"), "name" : "Understanding JAVA", "pages" : 100 }
{ "_id" : ObjectId("4f365b28d6d9d6de7c7ae4b2"), "name" : "Understanding JSON", "pages" : 200 }
添加更多的记录:
> book = {name : "Understanding XML", pages : 300}
> db.books.save(book)
> book = {name : "Understanding Web Services", pages : 400}
> db.books.save(book)
> book = {name : "Understanding Axis2", pages : 150}
> db.books.save(book)
6. 编写 Map 函数
接下来我们编写一个搜索功能,用来查找超过250页的图书:
1
|
> var map = function () {
|
2
|
var category;
|
3
|
if ( this .pages >= 250 )
|
4
|
category = 'Big Books' ;
|
5
|
else
|
6
|
category = "Small Books" ;
|
7
|
emit(category, {name: this .name});
|
8
|
};
|
所返回的结果:
{"Big Books",[{name: "Understanding XML"}, {name : "Understanding Web Services"}]);
{"Small Books",[{name: "Understanding JAVA"}, {name : "Understanding JSON"},{name: "Understanding Axis2"}]);
7. 编写 Reduce 函数
1
|
> var reduce = function (key, values) {
|
2
|
var sum = 0;
|
3
|
values.forEach( function (doc) {
|
4
|
sum += 1;
|
5
|
});
|
6
|
return {books: sum};
|
7
|
};
|
8. 在 books 集合中运行 MapReduce
1
|
> var count = db.books.mapReduce(map, reduce, {out: "book_results" });
|
2
|
> db[count.result].find()
|
3
|
4
|
{ "_id" : "Big Books" , "value" : { "books" : 2 } }
|
5
|
{ "_id" : "Small Books" , "value" : { "books" : 3 } }
|
上述结果表明我们有两本大书和三本小书。
利用 MongoDB 交互环境可以做任何事情,用 Java 也一样,但是你需要下载一些必须的jar包。
下面是 Java 的源码:
01
|
import com.mongodb.BasicDBObject;
|
02
|
import com.mongodb.DB;
|
03
|
import com.mongodb.DBCollection;
|
04
|
import com.mongodb.DBObject;
|
05
|
import com.mongodb.MapReduceCommand;
|
06
|
import com.mongodb.MapReduceOutput;
|
07
|
import com.mongodb.Mongo;
|
08
|
09
|
public class MongoClient {
|
10
|
11
|
/**
|
12
|
* @param args
|
13
|
*/
|
14
|
public static void main(String[] args) {
|
15
|
16
|
Mongo mongo;
|
17
|
|
18
|
try {
|
19
|
mongo = new Mongo( "localhost" , 27017 );
|
20
|
DB db = mongo.getDB( "library" );
|
21
|
22
|
DBCollection books = db.getCollection( "books" );
|
23
|
24
|
BasicDBObject book = new BasicDBObject();
|
25
|
book.put( "name" , "Understanding JAVA" );
|
26
|
book.put( "pages" , 100 );
|
27
|
books.insert(book);
|
28
|
|
29
|
book = new BasicDBObject();
|
30
|
book.put( "name" , "Understanding JSON" );
|
31
|
book.put( "pages" , 200 );
|
32
|
books.insert(book);
|
33
|
|
34
|
book = new BasicDBObject();
|
35
|
book.put( "name" , "Understanding XML" );
|
36
|
book.put( "pages" , 300 );
|
37
|
books.insert(book);
|
38
|
|
39
|
book = new BasicDBObject();
|
40
|
book.put( "name" , "Understanding Web Services" );
|
41
|
book.put( "pages" , 400 );
|
42
|
books.insert(book);
|
43
|
|
44
|
book = new BasicDBObject();
|
45
|
book.put( "name" , "Understanding Axis2" );
|
46
|
book.put( "pages" , 150 );
|
47
|
books.insert(book);
|
48
|
|
49
|
String map = "function() { " +
|
50
|
"var category; " +
|
51
|
"if ( this.pages >= 250 ) " +
|
52
|
"category = 'Big Books'; " +
|
53
|
"else " +
|
54
|
"category = 'Small Books'; " +
|
55
|
"emit(category, {name: this.name});}" ;
|
56
|
|
57
|
String reduce = "function(key, values) { " +
|
58
|
"var sum = 0; " +
|
59
|
"values.forEach(function(doc) { " +
|
60
|
"sum += 1; " +
|
61
|
"}); " +
|
62
|
"return {books: sum};} " ;
|
63
|
|
64
|
MapReduceCommand cmd = new MapReduceCommand(books, map, reduce,
|
65
|
null , MapReduceCommand.OutputType.INLINE, null );
|
66
|
67
|
MapReduceOutput out = books.mapReduce(cmd);
|
68
|
69
|
for (DBObject o : out.results()) {
|
70
|
System.out.println(o.toString());
|
71
|
}
|
72
|
} catch (Exception e) {
|
73
|
// TODO Auto-generated catch block
|
74
|
e.printStackTrace();
|
75
|
}
|
76
|
}
|
77
|
}
|
转载于:https://www.cnblogs.com/hasayaki/archive/2013/03/01/2938129.html
用MongoDB实现MapReduce相关推荐
- MongoDB中mapReduce的使用
MongoDB中mapReduce的使用 制作人:全心全意 mapReduce的功能和group by的功能类似,但比group by处理的数据量更大 使用示例: var map = function ...
- 使用MongoDB的MapReduce
MapReduce是Google在2004年推出的一种软件框架,用于支持对计算机集群中的大数据集进行分布式计算. 您可以从此处阅读有关MapReduce的信息 . MongoDB是用C ++编写的面向 ...
- MongoDB中MapReduce介绍与使用
本文来说下MongoDB中MapReduce介绍与使用 文章目录 概述 概述
- 一篇文章带你搞定 MongoDB 中 MapReduce 使用
玩过 Hadoop 的小伙伴对 MapReduce 应该不陌生,MapReduce 的强大且灵活,它可以将一个大问题分解为多个小问题,将各个小问题发送到不同的机器上去处理,所有的机器都完成计算后,再将 ...
- MongoDB:MapReduce的使用
文章目录 MongoDB:MapReduce的使用 一.简介 二.MapReduce命令 基本语法 案例 三.runCommand 命令 语法 案例 MongoDB:MapReduce的使用 一.简介 ...
- 在MongoDB的MapReduce上踩过的坑
太久没动这里,目前人生处于一个新的开始.这次博客的内容很久前就想更新上来,但是一直没找到合适的时间点(哈哈,其实就是懒),主要内容集中在使用Mongodb时的一些隐蔽的MapReduce问题: 1.R ...
- mongodb mapreduce用法
mongoDB的MapReduce简介 分类: MongoDB2012-12-06 21:378676人阅读评论(2)收藏举报 MongoDB MapReduce ...
- 快速掌握mongoDB(二)——聚合管道和MapReduce
上一节简单介绍了一下mongoDB的增删改查操作,这一节将介绍其聚合操作.我们在使用mysql.sqlserver时经常会用到一些聚合函数,如sum/avg/max/min/count等,mongoD ...
- MongoDB(3)--有关NoSQL及MongoDB的一些概念
学习任何东西在没有理解的前提下去背熟一些概念是没有用的,就像只背会了几个概念而没有理解的开发人员去面试是经不住面试官的追问的.前面的两篇对MongoDB做了简单的介绍,能够很快上手,对MongoDB有 ...
最新文章
- linux temp文件夹在哪_Win10系统下使用linux命令的方法
- 程序员下班不关电脑? | 每日趣闻
- cp: omitting directory”错误
- java编译后的扩展名,Java的源代码扩展名和编译完后是扩展名正确的是
- keil 在项目栏总有个叉_老股民的热心分享:均线金叉死叉买卖定式”,散户值得一看!...
- SQL Server上的审计表和数据版本控制
- Fragment学习1--生命周期
- 告别写笔记,AI 实时转写黑科技来了!
- 稳定币usda是哪个发行的_稳定币USDT的“发行”和“印刷”有什么区别?
- SVN客户端安装详细教程
- android 华为 imei,华为手机怎么查看IMEI码?华为手机查询IMEI串号两种方法,华为imei...
- 大数据开发,如何发掘数据的关系?
- 屏幕取色器(Qt实现)(放大镜,RGB显示,智能调节)
- 使用pip配置谷歌Colab Pytorch环境
- python判断两个数据集是否存在包含关系
- 转发和重定向的区别(forward和redirect的区别)
- C语言:习题2-5 求平方根序列前N项和.2021-08-02
- 人脸检测和识别的开源库总结
- 计算机的四屏故障维修,四则电脑显示器硬件故障检修实用技巧
- [RK3568 Android11] 开发之APP应用切换USB OTG模式
热门文章
- awk获取+sed替换+paste命令追加一列
- 国内人工玻璃体和日本人工玻璃体的区别
- redis删除指定key中的指定元素
- 在Ubuntu Linux 16.04下(64位)打开.ipynb文件
- 《机器学习》 周志华学习笔记第一章 绪论(课后习题)
- java 程序分析题_java程序入门50题分析:002
- 【机器学习】数据挖掘算法——关联规则(二),挖掘过程,Aprioir算法
- java mock什么意思_java @Mock, @MockBean 与 Mockito.mock( ) 之间的差异
- java 崩溃日志_Android收集程序崩溃日志的方法
- python调用远程的python文件_python 实现调用远程接口