如果单从概念上来说,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任务的更多相关文章

  1. Entity Framework教程翻译 ---- 系列教程

    Entity Framework教程(第二版) (翻译)Entity Framework技巧系列之十四 - Tip 56 (翻译)Entity Framework技巧系列之十三 - Tip 51 - ...

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

    英文版PDF下载地址http://download.csdn.net/detail/tsingheng/7480427 运算符是指一个特殊的符号,能够用来查看.更改值或者相加.比方说加法运算符+能够讲 ...

  3. 2.Swift教程翻译系列——Swift概览

    英文版PDF下载地址http://download.csdn.net/detail/tsingheng/7480427 依照传统学习程序语言都是从hello,world開始,在Swfit里面仅仅须要一 ...

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

    英文版PDF下载地址http://download.csdn.net/detail/tsingheng/7480427 我本来是做JAVA的.可是有一颗折腾的心,苹果公布Swift以后就下载了苹果的开 ...

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

    3.条件语句 常常会须要依据不同的情况来运行不同的代码. 你可能想要在错误发生的时候运行一段额外的代码,或者当某个值变得太高或者太低的时候给他输出出来.要实现这些需求,你能够使用条件分支. Swift ...

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

    英文版PDF下载地址http://download.csdn.net/detail/tsingheng/7480427 字符串是一组字符的有序序列,比方"hello,china"或 ...

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

    英文版PDF下载地址http://download.csdn.net/detail/tsingheng/7480427 Swift提供数组和字典两种集合类型.用来存储很多值的情况.数组有序的存储一组同 ...

  8. Android官方教程翻译(4)——启动另一个Activity

    Starting Another Activity 启动另一个Activity PREVIOUSNEXT THIS LESSON TEACHES YOU TO 这节课教你 1.   Respond t ...

  9. 《Entity Framework 6 Recipes》中文翻译 ---- 系列教程

    为了方便大家的阅读和学习,也是响应网友的建议,在这里为这个系列做一个目录.在目录开始这前,我先来回答之前遇到的几个问题. 1.为什么要学习EF? 这个问题很简单,项目需要.这不像学校,没人强迫你学习! ...

随机推荐

  1. c# 计算1-100之间的所有质数(素数)的和

    求1-100之间的所有质数(素数)的和: 所以先必须知道什么是质数? 一个数是不是素数   “素数”是指除了能被1和自身整除外,不能被任何其它整数整除的自然数. 然后知道有哪些是质数: 记忆的方法: ...

  2. 360每日自动签到,领取积分 (java httpclient4.x)

    如何登陆360,并每日自动签到这次的难点主要集中在登陆这里了,开始抓包发现360登陆验证很麻烦,但是后来发现一个简单的方法.因为我安装了360安全卫士,发现点击那个金币的按钮能直接验证登陆,哈哈~所以 ...

  3. Eclipse 下如何引用另一个项目的资源文件

    为什么要这么做?可参考:Eclipse 下如何引用另一个项目的Java文件 下面直接说下步骤:(项目A 引用 项目B的资源文件) 1.右键 项目A,点击菜单 Properties 2.在弹出的框中,点 ...

  4. WP7 MD5加密

    WP7不支持MD5加密,在网上找了一个实现MD5加密的算法. //Copyright (c) Microsoft Corporation. All rights reserved. using Sys ...

  5. typedef struct trx_struct trx_t;

    /* The transaction handle; every session has a trx object which is freed only when the session is fr ...

  6. Open Explorer Plugin for Eclipse (eclipse 插件 在eclipse里面打开文件目录)

    就是在eclipse里面直接打开文件所在的目录地址 只要将下面的jar 文件放到你的 “$ECLIPSE_HOME/plugins”  下面,重启eclipse就ok了 要想卸载的话  停止eclip ...

  7. UVa 11134 (区间上的贪心) Fabled Rooks

    这道题真是WA得我心力交瘁,好讨厌的感觉啊! 简直木有写题解的心情了 题意: n×n的棋盘里,放置n个车,使得任意两车不同行且不同列,且第i个车必须放在给定的第i个矩形范围内.输出一种方案,即每个车的 ...

  8. HDU 2059 龟兔赛跑

    受上一道题影响,我本来想着开一个二维数组来表示充电和不充电的状态. 可这样就有一个问题,如果没有充电,那么在下一个阶段就有剩余的电量. 这样问题貌似就不可解了,难道是因为不满足动态规划的无后效性这一条 ...

  9. UIPikerView

    UIPikerView的属性 1.   numberOfComponents:返回UIPickerView当前的列数 NSInteger num = _pickerView.numberOfCompo ...

  10. memcached缓存雪崩现象及解决办法

    1)什么是缓存雪崩?场景:一个访问很大的文章(论坛之类)的网站,使用memcached缓存用户查询过的文章.设置的缓存过期时间为6小时,所以没过6小时,缓存就会失效并重建一遍 问题:过六小时时,一部分 ...