RHadoop教程翻译系列 _Mapreduce(1)_第一个Mapreduce任务

如果单从概念上来说,Mapreduce和R中的函数lapply, tapply并无差别,它们都是把元素转化成列,然后计算索引(Mapreduce中的键),最后合并成一个定义好的组合。首先,让我们看一个简单的lappy的例子。

small.ints = 1:1000
sapply(small.ints, function(x) x^2)

这个例子比较简单,只是计算了前1000个整数的平方,不过我们可以从这个例子中对lappy这个函数有个基本的认知,接下来关于这个函数还有更多有意思的例子。现在让我们再来看看如何用Mapreduce来等同实现上一段程序的功能吧。

small.ints = to.dfs(1:1000)

mapreduce(
    input = small.ints,
    map = function(k, v) cbind(v, v^2))

通过以上程序,我们便轻松完成了第一个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任务

时间: 2024-10-07 05:28:51

RHadoop教程翻译系列 _Mapreduce(1)_第一个Mapreduce任务的相关文章

7.Swift教程翻译系列——控制流之循环

英文版PDF下载地址http://download.csdn.net/detail/tsingheng/7480427 Swift提供了类C语言类似的控制流结构.包括for循环和while循环来多次执行任务,if和switch语句根据不同的条件执行不同的分支代码,break和continue语句将执行流程跳转到其他语句. 除了C里面传统的for-条件-递增循环,Swift还增加了for-in循环使得遍历数组,字典,范围,字符串或者其他序列都很简单. Swift的switch语句也要比C语言的sw

8.Swift教程翻译系列——控制流之条件

3.条件语句 经常会需要根据不同的情况来执行不同的代码.你可能想要在发生错误的时候执行一段额外的代码,或者当某个值变得太高或者太低的时候给他输出出来.要实现这些需求,你可以使用条件分支. Swift提供两种方式来实现条件分支,也就是if语句和switch语句.一般来说If用在可能的情况比较少的简单条件中,当遇到复杂条件有很多种可能性的时候使用switch会更好,或者要根据模式匹配来判断要执行什么代码的时候switch也很有用. if语句 if的最简单形式只有一个单独的if条件,只有当条件为tru

6.Swift教程翻译系列——Swift集合类型

英文版PDF下载地址http://download.csdn.net/detail/tsingheng/7480427 Swift提供数组和字典两种集合类型,用来存储许多值的情况.数组有序的存储一组相同类型的值.字典也存储一组相同类型的值但是是无序的,字典中存储的值可以通过一个唯一的标识(也就是Key)来查找. 在Swift中,数组和字典总是清楚自己能存储的值的类型和key的类型.也就是说你不会错误的把其他不对应的类型存进数组或者字典.所以你也能确定从数组或者字典中取出来的值的类型肯定也不会错了

4.Swift教程翻译系列——Swift基本运算符

英文版PDF下载地址http://download.csdn.net/detail/tsingheng/7480427 运算符是指一个特殊的符号,能够用来查看.更改值或者相加.比方说加法运算符+能够讲两个数字加起来. 另一些复杂的样例比方逻辑与&&或者自增++.Swift支持C中得大部分运算符,而且增加了一些增强的特性来降低代码中的错误.赋值预算符=不会返回值.这样就避免了在应该使用比較运算符==的地方误用=.数学运算符(加减乘除模)会做溢出推断,这样避免了值溢出的时候出现的奇怪现象.你能

1.Swift教程翻译系列——关于Swift

英文版PDF下载地址http://download.csdn.net/detail/tsingheng/7480427 我本来是做JAVA的.可是有一颗折腾的心,苹果公布Swift以后就下载了苹果的开发文档.啃了几天.朦朦胧胧的看了个几乎相同,想静下心看能不能整个翻译出来.我英语一般般,仅仅是大致能看明确意思,非常多形容词不晓得该怎么说.希望众大神看到不合适的地方能指正.以下是第一篇,About Swift. 这篇最难翻译了. Swift是一种新的用于iOS和OS X应用开发的编程语言Swift

5.Swift教程翻译系列——Swift字符串和字符

英文版PDF下载地址http://download.csdn.net/detail/tsingheng/7480427 字符串是一组字符的有序序列,比方"hello,china"或者"albatross".Swfit里字符串用String表示,String也是字符类型Charactar的集合类型.Swift的String和Charactor类型提供了高速的,符合Unicode编码规范的方式来处理文本. 创建或者操作的语法都非常轻便易读.跟C的语法也非常相似.Stri

好程序员大数据教程Scala系列之样例类_Option_偏函数

好程序员大数据教程Scala系列之样例类_Option_偏函数,在Scala中Option类型样例类用来表示可能存在或也可能不存在的值(Option的子类有Some和None).Some包装了某个值,None表示没有值. object?OptionDemo {??def?main(args: Array[String]) {????val?map = Map("a"?-> 1, "b"?-> 2)????val?v = map.get("b&q

使用Material Design 创建App翻译系列----材料主题的使用(Using Material Theme)

上一篇是使用Material Design 创建App翻译系列--開始学习篇,进入正题: 新的材料主题提供了下面内容: 1. 提供了同意设置颜色板的系统部件组件. 2. 为这些系统组件提供了触摸反馈动画. 3. Activity的过渡动画. 依据你的品牌标识,使用你所控制的颜色板能够自己定义材料主题的外观. 使用主题的属性能够给ActionBar 和 status bar进行着色. 系统部件拥有新的设计和触摸反馈动画.你能够为你的应用自己定义颜色板.触摸反馈动画以及Activity之间跳转的过渡

TypeScript手册翻译系列8-常见错误与Mixins

常见错误 下面列出了在使用TypeScript语言和编译器期间,经常会遇到的一些常见错误. "tsc.exe" exited with error code 1. 解决方案: 检查文件编码为UTF-8 - https://typescript.codeplex.com/workitem/1587 external module XYZ cannot be resolved 解决方案:检查模块路径是大小写敏感- https://typescript.codeplex.com/workit