saprk里面的action - aggregate
上一篇讲到了spark里面的action函数:
Action列表:
- reduce
- collect
- count
- first
- take
- takeSample
- takeOrdered
- saveAsTextFile
- saveAsSequenceFile
- saveAsObjectFile
- countByKey
- foreach
action貌似还有:
aggregate(zeroValue,seq,comb,taskNums)
将初始值和第一个分区中的第一个元素传递给seq函数进行计算,然后将计算结果和第二个元素传递给seq函数,直到计算到最后一个值。第二个分区中也是同理操作。最后将初始值、所有分区的结果经过combine函数进行计算(先将前两个结果进行计算,将返回结果和下一个结果传给combine函数,以此类推),并返回最终结果。
>>> data = sc.parallelize((,,,,,),)
>>> def seq(a,b):
... print 'seqOp:'+str(a)+"\t"+str(b)
... return min(a,b)
...
>>> def combine(a,b):
... print 'comOp:'+str(a)+"\t"+str(b)
... return a+b
...
>>> data.aggregate(,seq,combine)
seqOp:
seqOp:
seqOp:
seqOp:
seqOp:
seqOp:
comOp:
comOp: >>>
注意里面有一个初始值,而初始值既用在seq里面,也用在combine里面。
aggregateByKey(zeroValue,seq,comb,taskNums)
在kv对的RDD中,,按key将value进行分组合并,合并时,将每个value和初始值作为seq函数的参数,进行计算,返回的结果作为一个新的kv对,然后再将结果按照key进行合并,最后将每个分组的value传递给combine函数进行计算(先将前两个value进行计算,将返回结果和下一个value传给combine函数,以此类推),将key与计算结果作为一个新的kv对输出。
注意:aggregateByKey中的初始值只需要和reduce函数计算,不需要和combine函数结合计算,所以导致结果有点不一样。
val data = List((,),(,),(,),(,),(,),(,))
val rdd = sc.parallelize(data) val res : RDD[(Int,Int)] = rdd.aggregateByKey()(
// seqOp
math.max(_,_),
// combOp
_+_
)
得到:
根据Key值的不同,可以分为3个组: () (,),(,),(,); () (,); () (,),(,)。 这3个组分别进行seqOp,也就是(K,V)里面的V和0进行math.max()运算,运算结果和下一个V继续运算,以第一个组为例,运算过程是这样的: , => , => , => 所以最终结果是(,)。combOp是对把各分区的V加起来,由于这里并没有分区,所以实际上是不起作用的。
运行结果:
(2,3)
(1,4)
(3,8)
那么如果增加了分区,结果:
如果生成RDD时分成3个区: val rdd = sc.parallelize(data,)
运行结果就变成了: (,)
(,)
(,)
这是因为一个分区返回(,),另一个分区返回(,),combOp将这两个V加起来,就得到了(,)。
>>> data = sc.parallelize([(,),(,),(,),(,)])
>>> def seq(a,b):
... return max(a,b)
...
>>> def combine(a,b):
... return a+b
...
>>> data.aggregateByKey(,seq,comb,).collect()
[(, ), (, )]
注意上面,如果最后一个参数是1或者2,那么结果是7.
fold函数
- reduce()与fold()方法是对同种元素类型数据的RDD进行操作,即必须同构。其返回值返回一个同样类型的新元素。
fold()与reduce()类似,接收与reduce接收的函数签名相同的函数,另外再加上一个初始值作为第一次调用的结果。(例如,加法初始值应为0,乘法初始值应为1)
num.fold(0,lambda x,y:x+y)
aggregate()方法可以对两个不同类型的元素进行聚合,即支持异构。
fold是aggregate的简化,将aggregate中的seqOp和combOp使用同一个函数op。
- scala> rdd1.fold(1)(
- | (x,y) => x + y
- | )
- res19: Int = 58
- ##结果同上面使用aggregate的第一个例子一样,即:
- scala> rdd1.aggregate(1)(
- | {(x,y) => x + y},
- | {(a,b) => a + b}
- | )
- res20: Int = 58
另外还有foldLeft foldRight
细节先不看了。
saprk里面的action - aggregate的更多相关文章
- form里面的action和method(post和get的方法)使用
一.form里面的action和method的post使用方法 <%@ Page Language="C#" AutoEventWireup="true" ...
- nopcommerce里面的@Html.Widget("home_page_top") 是什么?
很多朋友在修改模板的时候看到很多类似@Html.Widget("xxx")的东西,这里简单介绍一下流程: 比如@Html.Widget("home_page_top&qu ...
- 为Textview里面的ImageSpan添加点击响应事件
对于图文混排的TextView,用户在浏览到里面的图片的时候,往往有点击图片preview大图或者preview之后保存图片的需求,这就需要为Textview里面的ImageSpan设置点击响应事件. ...
- Android动态改变App在Launcher里面的icon
如果呆萌的产品童鞋让你动态更换App在Launcher里面的Icon,你怎么回答他,下文就提出一种实现该效果的方法. 原理1--activity-alias 在AndroidMainifest中,有两 ...
- 讲一下Asp.net core MVC2.1 里面的 ApiControllerAttribute
先贴文章链接 正文 ASP.NET Core MVC 2.1 特意为构建 HTTP API 提供了一些小特性,今天主角就是 ApiControllerAttribute. (注:文章是18年2月份的, ...
- 讲一下Asp.net core MVC2.1 里面的 ApiControllerAttribute (转载)
ASP.NET Core MVC 2.1 特意为构建 HTTP API 提供了一些小特性,今天主角就是 ApiControllerAttribute. (注:文章是18年2月份的,所以文章提到了cor ...
- javaWeb中怎么获取提交表单里面的值
在javaWeb中如何获得html文件中的表单里面的值? <!DOCTYPE html> <html> <head> <meta charset=" ...
- ajax实现注册用户名时动态显示用户名是否已经被注册(1、ajax可以实现我们常见的注册用户名动态判断)(2、jquery里面的ajax也是类似我们这样封装了的函数)
ajax实现注册用户名时动态显示用户名是否已经被注册(1.ajax可以实现我们常见的注册用户名动态判断)(2.jquery里面的ajax也是类似我们这样封装了的函数) 一.总结 1.ajax可以实现我 ...
- Activity往另外一个Activity传值,Fragment获取另外一个Activity里面的值。
在oneActivity中实现跳转到MainActivity //intent 用来跳转另外一个MainActivity,bundle传值到MainActivity Intent Ma ...
随机推荐
- String,StringBuffer和StringBuilder
在执行速度方面的比较:StringBuilder > StringBuffer StringBuffer与StringBuilder,他们是字符串变量,是可改变的对象,每当我们用它们对字符串做操 ...
- ZOJ 3666 博弈 SG函数
SG函数: 对于任意状态,定义SG(x)=mex(S),其中S是x的后继状态的SG函数值集合,mex(S)表示不再S内的最小非负整数 SG(X)=0当且仅当x为必败态. 解: 构造一个有向无环图(树) ...
- MySQL索引----数据结构及算法原理
摘要 本文以MySQL数据库为研究对象,讨论与数据库索引相关的一些话题.特别需要说明的是,MySQL支持诸多存储引擎,而各种存储引擎对索引的支持也各不相同,因此MySQL数据库支持多种索引类型,如BT ...
- Android仿今日头条和知乎等App顶部滑动导航实现代码分析及源码下载
一.本文所涉及到的知识点 源码下载 二.目标 通过利用ViewPager+FragmentStatePagerAdapter+TabLayout 实现顶部滑动效果,如图: 三.知识点讲解 1.View ...
- Android项目实战_手机安全卫士程序锁
###1.两个页面切换的实现1. 可以使用Fragment,调用FragmentTransaction的hide和show方法2. 可以使用两个布局,设置visibility的VISIABLE和INV ...
- 02--Tomcat总体结构分析一
注:此文章大部分参考大神文档,并且结合自身理解,补充了其他相关知识,谢绝转载. 大神原文地址链接:http://www.ibm.com/developerworks/cn/java/j-lo ...
- nagios插件nagiosql安装配置
nagios插件nagiosql安装配置 # Nagiosql install [root@Cagios ~]# yum install -y libssh2 libssh-devel [root@C ...
- Django中 基于form的注册,基于ajax的登录
1 form.py中写register的的form组件 from django import forms class Register(forms.Form): # 注册的form username ...
- Node.js 命令行程序开发教程 ---------http://www.ruanyifeng.com/blog/2015/05/command-line-with-node.html
五.yargs 模块 shelljs 只解决了如何调用 shell 命令,而 yargs 模块能够解决如何处理命令行参数.它也需要安装. $ npm install --save yargs yarg ...
- js的StringBuffer类
function StringBuffer(str){ var arr = []; str = str || ""; arr.push(str); this.append = fu ...