上一篇讲到了spark里面的action函数:

Action列表:

  • reduce
  • collect
  • count
  • first
  • take
  • takeSample
  • takeOrdered
  • saveAsTextFile
  • saveAsSequenceFile
  • saveAsObjectFile
  • countByKey
  • foreach

action貌似还有:

6.top  按默认或者指定的排序规则返回前n个元素,默认按降序输出
10.lookup   lookup(k):作用于K-V类型的RDD上,返回指定K的所有V值
 
里面有几个比较难搞清楚的函数,比如 aggregate , 还有 aggregateByKey
参考 http://blog.csdn.net/zhihaoma/article/details/52609503
 

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函数结合计算,所以导致结果有点不一样。

注意这里面 combine 会把不同分区的合起来。而且函数里面也带了taskNums,非常绕。
先看例子:
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。

  1. scala> rdd1.fold(1)(
  2. | (x,y) => x + y
  3. | )
  4. res19: Int = 58
  5. ##结果同上面使用aggregate的第一个例子一样,即:
  6. scala> rdd1.aggregate(1)(
  7. | {(x,y) => x + y},
  8. | {(a,b) => a + b}
  9. | )
  10. res20: Int = 58

另外还有foldLeft foldRight

细节先不看了。

saprk里面的action - aggregate的更多相关文章

  1. form里面的action和method(post和get的方法)使用

    一.form里面的action和method的post使用方法 <%@ Page Language="C#" AutoEventWireup="true" ...

  2. nopcommerce里面的@Html.Widget("home_page_top") 是什么?

    很多朋友在修改模板的时候看到很多类似@Html.Widget("xxx")的东西,这里简单介绍一下流程: 比如@Html.Widget("home_page_top&qu ...

  3. 为Textview里面的ImageSpan添加点击响应事件

    对于图文混排的TextView,用户在浏览到里面的图片的时候,往往有点击图片preview大图或者preview之后保存图片的需求,这就需要为Textview里面的ImageSpan设置点击响应事件. ...

  4. Android动态改变App在Launcher里面的icon

    如果呆萌的产品童鞋让你动态更换App在Launcher里面的Icon,你怎么回答他,下文就提出一种实现该效果的方法. 原理1--activity-alias 在AndroidMainifest中,有两 ...

  5. 讲一下Asp.net core MVC2.1 里面的 ApiControllerAttribute

    先贴文章链接 正文 ASP.NET Core MVC 2.1 特意为构建 HTTP API 提供了一些小特性,今天主角就是 ApiControllerAttribute. (注:文章是18年2月份的, ...

  6. 讲一下Asp.net core MVC2.1 里面的 ApiControllerAttribute (转载)

    ASP.NET Core MVC 2.1 特意为构建 HTTP API 提供了一些小特性,今天主角就是 ApiControllerAttribute. (注:文章是18年2月份的,所以文章提到了cor ...

  7. javaWeb中怎么获取提交表单里面的值

    在javaWeb中如何获得html文件中的表单里面的值? <!DOCTYPE html> <html> <head> <meta charset=" ...

  8. ajax实现注册用户名时动态显示用户名是否已经被注册(1、ajax可以实现我们常见的注册用户名动态判断)(2、jquery里面的ajax也是类似我们这样封装了的函数)

    ajax实现注册用户名时动态显示用户名是否已经被注册(1.ajax可以实现我们常见的注册用户名动态判断)(2.jquery里面的ajax也是类似我们这样封装了的函数) 一.总结 1.ajax可以实现我 ...

  9. Activity往另外一个Activity传值,Fragment获取另外一个Activity里面的值。

    在oneActivity中实现跳转到MainActivity //intent 用来跳转另外一个MainActivity,bundle传值到MainActivity         Intent Ma ...

随机推荐

  1. [Swift通天遁地]六、智能布局-(2)视图对象的尺寸和位置相对约束

    ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★➤微信公众号:山青咏芝(shanqingyongzhi)➤博客园地址:山青咏芝(https://www.cnblogs. ...

  2. javascript中for...in和for...of的区别

    for...of循环是ES6引入的新的语法. for...in遍历拿到的x是键(下标).而for...of遍历拿到的x是值,但在对象中会提示不是一个迭代器报错.例子如下: let x; let a = ...

  3. Java系列学习(十三)-字符串

    1.字符串基础 概念:字符串本质是打包字符数组的对象,是java.lang.String类的实例 2.字符串的构造方法 public String() public String(byte[] byt ...

  4. Java中的异常注意点

    在java中 使用throw关键字抛出异常       使用throws关键字声明异常 public static void main(String[] args) throws Exception{ ...

  5. phpstorm如何在同一个文件夹打开多个目录

    phpstorm默认一个窗口只显示一个项目,如果新建一个项目,他会给你个选项卡,问你是在新窗口打开新项目还是在本窗口打开. 能不能在一个窗口打开多个项目呢?就像sublime text那样,其实是可以 ...

  6. [Windows Server 2012] Tomcat安全加固方法

    ★ 欢迎来到[护卫神·V课堂],网站地址:http://v.huweishen.com ★ 护卫神·V课堂 是护卫神旗下专业提供服务器教学视频的网站,每周更新视频. ★ 本节我们将带领大家:Tomca ...

  7. Codeforces_718A

    A. Efim and Strange Grade time limit per test 1 second memory limit per test 256 megabytes input sta ...

  8. STL_优先队列_(转载)

    转自:http://www.cnblogs.com/summerRQ/articles/2470130.html STL容器之优先队列 优先级队列,以前刷题的时候用的比较熟,现在竟然我只能记得它的关键 ...

  9. zepto处理touch事件

    处理Touch事件能让你了解到用户的每一根手指的位置,在touch事件触发的时候产生,可以通过touch event handler的event对象取到,如果基于zepto.js开发,一般是通过eve ...

  10. 怎么用最短时间高效而踏实地学习Python?

    之所以写这篇文章,在标题里已经表达得很清楚了.做技术的人都知道,时间就是金钱不是一句空话,同一个技术,你比别人早学会半年,那你就能比别人多拿半年的钱.所以有时候别人去培训我也不怎么拦着,为什么?因为培 ...