RHadoop教程翻译系列 _Mapreduce(1)_第一个Mapreduce任务
如果单从概念上来说,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? 这个问题很简单,项目需要.这不像学校,没人强迫你学习! ...
随机推荐
- Database: Normal form
refer to wikipedia--- 1NF(first normal form): 1. There's no top-to-bottom ordering to the rows. 2. T ...
- Kernel rest_init相关
Linux系统里,有些进程只有kernel部分的代码,即由一个kernel函数进入,在sched的时候,将其与用户进程同等对待. PID为0的叫swapper或sched进程,对应函数为rest_in ...
- java操作office和pdf文件页面列表导出cvs,excel、pdf报表.
在平常的开发中我们常常遇到不仅仅只是导出excel报表的情况.有时候也需要导出pdf或者CSV报 表.其实原理都差不多.刚开始本来不打算也这篇博客介绍这个的.感觉这篇博客和前面的博客有点雷同.原理基本 ...
- leetcode:Happy Number
要求:Write an algorithm to determine if a number is "happy". A happy number is a number defi ...
- Android开源库--Asynchronous Http Client异步http客户端
如果说我比别人看得更远些,那是因为我站在了巨人的肩上. github地址:https://github.com/loopj/android-async-http Api文档地址:http://loop ...
- CSS选择符类型
一.标签选择符:针对某一类标签,可以以标签作为选择符 <style type="text/css"> p{color:#F00; font-size:36px;} &l ...
- 基础组件_Window(窗口)
窗口控件是一个浮动和可拖拽的面板可以用作应用程序窗口.默认情况下,窗口可以移动,调整大小和关闭.它的内容也可以被定义为静态html或要么通过ajax动态加载. 1. 通过标签创建窗口
- SVN功能详解
SVN功能详解 TortoiseSVN是windows下其中一个非常优秀的SVN客户端工具.通过使用它,我们可以可视化的管理我们的版本库.不过由于它只是一个客户端,所以它不能对版本库进行权限管理. ...
- hihoCoder #1176 : 欧拉路·一 (简单)
题意:给出n个岛,每个岛都有桥到达其他岛,且桥数可多可少(即使两岛有多桥),判断是否是欧拉路(即每条桥只能走一次,所有桥都能遍历1遍). 思路: 满足如下条件之一者即为欧拉路: 1.连通图,每个岛的度 ...
- php时区测试
php里面关于时间的函数有date,time,strtotime,gmdate等,里面只要和时间字符串相关的基本都收到时区的影响,所以时间戳才是唯一稳定时间记录,因为标准都是统一的.这里联想到数据库的 ...