如果单从概念上来说,Mapreduce和R中的函数lapply, tapply并无差别,它们都是把元素转化成列,然后计算索引(Mapreduce中的键),最后合并成一个定义好的组合。首先,让我们看一个简单的lappy的例子。
small.ints = :
sapply(small.ints, function(x) x^)
这个例子比较简单,只是计算了前1000个整数的平方,不过我们可以从这个例子中对lappy这个函数有个基本的认知,接下来关于这个函数还有更多有意思的例子。现在让我们再来看看如何用Mapreduce来等同实现上一段程序的功能吧。
small.ints = to.dfs(:) mapreduce(
input = small.ints,
map = function(k, v) cbind(v, v^))
通过以上程序,我们便轻松完成了第一个Mapreduce任务。这段Mapreduce程序和Lapply程序实现的功能基本上是一样的,但仍有一些相异处,让我们先来看看Mapreduce 的前两行代码。第一行代码通过函数to.dfs实现将数据放入HDFS。HDFS是Hadoop分布式文件系统,用来存放需要运作Mapreduce任务的数据。这里要说明一下,to.dfs并不适合写入海量数据,更适合用来做一些小的测试用例,或者修改bug之类的任务。如果你不指明存放数据的位置和名称,to.dfs会默认将数据存入临时文件,并且在任务结束后会自动清空数据。to.dfs函数的返回值是一个大数据对象。我们可以把它赋给一个变量,传给另外的rmr函数、Mapreduce任务,或者只是把它读回。to.dfs是一个stub,也就是说,数据不在内存中,只有一些信息帮助定位和管理数据。通过这种方式你可以使用一些超出内存限制的大数据。
现在让我们来看第二行代码。这行代码使用了Mapreduce函数来替代Lapply函数。对于Mapreduce,我们更倾向于使用已命名的参数,因为Mapreduce需要用到的参数比较少,不过这点并不是强制的。在这行代码中,我们输入的变量是small.ints,这个变量包含了to.dfs输出的数据。在我们的HDFS版本中,to.dfs输出的数据可以是一个文件的路径,也可以是一个混合有数据和文件的列表。在R中使用时,map函数(与之相反的是reduce函数,在接下来的介绍中我们会提到)需要注意一些限制条件:
1. map函数含有两个参数,一个是键:key,一个是值:value;
2. 当map函数返回键值对时,使用的函数是keyval。keyval的参数形式可以是向量,列表,矩阵或者是数据框架;当然,你也可以返回NULL值。当调用keyval时,你可以不必指明所有的参数,返回值x会被转成keyval(NULL,x)的调用值。当reduce函数已经确定时,在Map函数中使用空键是不允许的,而当使用combine函数时,这种情况更不允许发生,因为在shuffle阶段必须要指定键。
在这个例子中,我们只使用了值而没有使用键,如果要完成一个基本的Mapreduce用例,我们需要同时使用键和值。Mapreduce返回的值是一个大数据对象,你可以把它当做输入值传给其他任务,或者用from.dfs函数把它读入内存。与to.dfs类似的是,from.dfs同样不适用于海量数据,它返回的是一个键-值对的集合。当mapreduce任务生成的是一个相对小规模的结果时,比如合计,from.dfs就比较适用,接下来可以对其结果进行更进一步的可视化操作,使得结果更具易读性。在产出工作中,from.dfs比to.dfs更重要。
RHadoop教程翻译系列 _Mapreduce(1)_第一个Mapreduce任务的更多相关文章
-
Entity Framework教程翻译 ---- 系列教程
Entity Framework教程(第二版) (翻译)Entity Framework技巧系列之十四 - Tip 56 (翻译)Entity Framework技巧系列之十三 - Tip 51 - ...
-
4.Swift教程翻译系列——Swift基本运算符
英文版PDF下载地址http://download.csdn.net/detail/tsingheng/7480427 运算符是指一个特殊的符号,能够用来查看.更改值或者相加.比方说加法运算符+能够讲 ...
-
2.Swift教程翻译系列——Swift概览
英文版PDF下载地址http://download.csdn.net/detail/tsingheng/7480427 依照传统学习程序语言都是从hello,world開始,在Swfit里面仅仅须要一 ...
-
1.Swift教程翻译系列——关于Swift
英文版PDF下载地址http://download.csdn.net/detail/tsingheng/7480427 我本来是做JAVA的.可是有一颗折腾的心,苹果公布Swift以后就下载了苹果的开 ...
-
8.Swift教程翻译系列——控制流之条件
3.条件语句 常常会须要依据不同的情况来运行不同的代码. 你可能想要在错误发生的时候运行一段额外的代码,或者当某个值变得太高或者太低的时候给他输出出来.要实现这些需求,你能够使用条件分支. Swift ...
-
5.Swift教程翻译系列——Swift字符串和字符
英文版PDF下载地址http://download.csdn.net/detail/tsingheng/7480427 字符串是一组字符的有序序列,比方"hello,china"或 ...
-
6.Swift教程翻译系列——Swift集合类型
英文版PDF下载地址http://download.csdn.net/detail/tsingheng/7480427 Swift提供数组和字典两种集合类型.用来存储很多值的情况.数组有序的存储一组同 ...
-
Android官方教程翻译(4)——启动另一个Activity
Starting Another Activity 启动另一个Activity PREVIOUSNEXT THIS LESSON TEACHES YOU TO 这节课教你 1. Respond t ...
-
《Entity Framework 6 Recipes》中文翻译 ---- 系列教程
为了方便大家的阅读和学习,也是响应网友的建议,在这里为这个系列做一个目录.在目录开始这前,我先来回答之前遇到的几个问题. 1.为什么要学习EF? 这个问题很简单,项目需要.这不像学校,没人强迫你学习! ...
随机推荐
-
2016年10月20日 星期四 --出埃及记 Exodus 19:4
2016年10月20日 星期四 --出埃及记 Exodus 19:4 `You yourselves have seen what I did to Egypt, and how I carried ...
-
[转载]深入理解JAVA的接口和抽象类
深入理解Java的接口和抽象类 对于面向对象编程来说,抽象是它的一大特征之一.在Java中,可以通过两种形式来体现OOP的抽象:接口和抽象类.这两者有太多相似的地方,又有太多不同的地方.很多人在初学的 ...
-
基于高性能的硬件配置Nginx
Nginx高级配置将涉及硬件,假设你配置不好,直接使各种性能下降. 我这里总结一下.怎样依据server的硬件设备来配置Nginx. 见下图: 低訪问量的网络,能够这样配置. 标准的网络訪问量,能够这 ...
-
AVR编程_如何通过软件复位AVR?(转)
源:http://blog.sina.com.cn/s/blog_493520900100bpos.html Question 如何通过软件复位AVR? Answer 如果你想通过软件复位AVR,你应 ...
-
MySQL执行插入操作时报错1366 - Incorrect string value
今天在测试mysql时,发现插入数据的问题,下面和大家分享下解决方法: 首先看问题原因: [Err] 1366 - Incorrect string value: '\xCF\xD6' for col ...
-
C# .Net List<;T>;中Remove()、RemoveAt()、RemoveRange()、RemoveAll()的区别,List<;T>;删除汇总
在List<T>中删除主要有Remove().RemoveAt().RemoveRange().RemoveAll()这几个方法.下面一一介绍使用方法和注意点. 我们以List<st ...
-
ansible Api 2.3-2.4
官网示例(python3) 说明: 在学习2.0 api的过程中遇到了一个坑,最新版的ansible(2.4)和2.3版本api引用时发生了变化,本文主要使用2.3 api进行操作,2.4只做分析 a ...
-
jsp 起航 和Servlet通过attribute通信
@WebServlet(name = "ticketServlet",urlPatterns = {"/tickets"},loadOnStartup = 1) ...
-
解决Firefox下,页面元素不刷新问题
由于FireFox的刷新机制与IE有较大区别.所以javascript代码 document.location.reload();通常在IE上工作正常,在Firefox下效果却并不理想,这是因为Fir ...
-
AngularJS实战之cookie的读取
<!DOCTYPE html> <html ng-controller="cookies_controller"> <head> <tit ...