Spark RDD的fold和aggregate为什么是两个API?为什么不是一个foldLeft?
欢迎关注我的新博客地址:http://cuipengfei.me/blog/2014/10/31/spark-fold-aggregate-why-not-foldleft/
大家都知道Scala标准库的List有一个用来做聚合操作的foldLeft方法。
比方我定义一个公司类:
1 |
|
它有名字和子公司。 然后定义几个公司:
1 |
|
三家大公司,然后呢,我如果有一家超牛逼的公司把它们给合并了:
1 |
|
这个运行的结果是这种:
1 |
|
可见foldLeft的结果是一家包括了BAT三大家得新公司。
由List[Company]聚合出一个新的Company,这样的属于foldLeft的同构聚合操作。
同一时候,foldLeft也能够做异构的聚合操作:
1 |
|
它的运行结果是这种:
1 |
|
由List[Company]聚合出一个String。
这种API感觉非常方便。仅仅要是聚合。不管同构异构。都能够用它来做。
近期接触了Spark,当中的RDD是做分布式计算时最经常使用的一个类。
RDD有一个叫做fold的API,它和foldLeft的签名非常像,唯一差别是它仅仅能做同构聚合操作。
也就是说假设你有一个RDD[X],通过fold,你仅仅能构造出一个X。
假设我想通过一个RDD[X]构造一个Y出来呢?
那就得用aggregate这个API了,aggregate的签名是这种:
1 |
|
它比fold和foldLeft多须要一个combOp做參数。
这让我非常不解,同构和异构的API干嘛非得拆成两个呢?怎么不能学Scala的标准库,把它做成类似foldLeft的样子呢?
后来想明确了,这是因为Spark须要分布运算造成的。
先想一下Scala List的foldLeft是怎么工作的?
1 |
|
- 拿到初始值,即名字为king的公司,把它和list中的第一个公司合并,成为一个包括一家子公司的新公司
- 把上一步中的新公司拿来和list中的第二个公司合并,成为一个包括两家子公司的新公司
- 把上一步中的新公司拿来和list中的第三个公司合并,成为一个包括三家子公司的新公司
这是同构的过程。
1 |
|
- 拿到初始值,即空字符串。把它和list中的第一个公司的名字拼在一起,成为B
- 把上一步中的B第二个公司名字拼一起。成为BA
- 把上一步中的BA拿来和list中的第三个公司的名字拼一起,成为BAT
这是异构的过程。
像多米诺骨牌一样,从左到右依次把list中的元素吸收入结果中。
如今如果RDD[X]中有一个类似foldLeft的API,其签名和foldLeft一致,我如今调用foldLeft,给它一个f:(Y,X)=>Y,接下来该发生什么呢?
- 由于要分布计算,所以我先要把手里的非常多个X分成几份。分发到不同的节点上去
- 每一个节点把拿到的非常多个X计算出一个Y出来
- 把全部节点的结果拿来,这时我手里就有了非常多个Y
- 啊。。。我不知道怎么把非常多个Y变成一个Y啊。。。
因为Spark的RDD不像Scala的List一样仅仅须要推倒一副多米诺骨牌。而是要推倒非常多副。最后再对非常多副多米诺骨牌的结果做聚合。
这时假设是同构还好,我仅仅须要再用f:(X,X)=>X做一遍就ok了。
可是假设是异构的,那我就必须得再须要一个f:(Y,Y)=>Y了。
Spark RDD的fold和aggregate为什么是两个API?为什么不是一个foldLeft?的更多相关文章
- Apache Spark : RDD
Resilient Distributed Datasets Resilient Distributed Datasets (RDD) is a fundamental data structure ...
- Spark RDD
对RDD的学习进行一下整理 RDD:基于内存的集群计算容错抽象 分布式内存抽象的概念---弹性分布式数据集(RDD),它具备MapReduce等数据流模型的容错特性,并且允许开发人员在大型集群上执行基 ...
- Spark RDD概念学习系列之Spark的算子的分类(十一)
Spark的算子的分类 从大方向来说,Spark 算子大致可以分为以下两类: 1)Transformation 变换/转换算子:这种变换并不触发提交作业,完成作业中间过程处理. Transformat ...
- spark RDD编程,scala版本
1.RDD介绍: RDD,弹性分布式数据集,即分布式的元素集合.在spark中,对所有数据的操作不外乎是创建RDD.转化已有的RDD以及调用RDD操作进行求值.在这一切的背后,Spark会自动 ...
- Spark RDD编程核心
一句话说,在Spark中对数据的操作其实就是对RDD的操作,而对RDD的操作不外乎创建.转换.调用求值. 什么是RDD RDD(Resilient Distributed Dataset),弹性分布式 ...
- Spark RDD :Spark API--Spark RDD
一.RDD的概述 1.1 什么是RDD? RDD(Resilient Distributed Dataset)叫做弹性分布式数据集,是Spark中最基本的数据抽象,它代表一个不可变.可分区.里面的元素 ...
- Spark Rdd coalesce()方法和repartition()方法
在Spark的Rdd中,Rdd是分区的. 有时候需要重新设置Rdd的分区数量,比如Rdd的分区中,Rdd分区比较多,但是每个Rdd的数据量比较小,需要设置一个比较合理的分区.或者需要把Rdd的分区数量 ...
- Spark RDD aggregateByKey
aggregateByKey 这个RDD有点繁琐,整理一下使用示例,供参考 直接上代码 import org.apache.spark.rdd.RDD import org.apache.spark. ...
- spark RDD transformation与action函数整理
1.创建RDD val lines = sc.parallelize(List("pandas","i like pandas")) 2.加载本地文件到RDD ...
随机推荐
- Linux下利用backtrace追踪函数调用堆栈以及定位段错误【转】
转自:https://www.linuxidc.com/Linux/2012-11/73470p2.htm 通常情况系,程序发生段错误时系统会发送SIGSEGV信号给程序,缺省处理是退出函数.我们可以 ...
- jquery-css处理
jquery css处理,包括CSS,位置,尺寸等 一:CSS 使用 说明 例子 css(name|pro|[,val|fn]) 访问匹配元素的样式属性 $("p").css(&q ...
- vue项目里的日期格式化
在项目中,我们经常需要把后台传回的日期进行格式化,可以在common里定义一个公共的js export function formatDate (date, fmt) { if (/(y+)/.tes ...
- OCR识别-python3.5版
刚接触,啥子都不会,按着教程走 需求:识别图片中的文字信息环境:windows系统 开发语言:python3.5 使用工具类:1.pyocr 2.PIL 3.tesseract-ocr 步骤: 1.p ...
- 《jquery实战》javascript 必知必会(2)
A2 一等公民函数 在传统 OO 语言里,对象包含数据和方法.这些语言里,数据和方法通常是不同的概念:javascript另辟蹊径. 与其他 js 的类型一样,函数可以作为对象处理,如String.N ...
- SpringMVC高级参数绑定(数组和List)
本节内容: 参数绑定之数组 将表单的数据绑定到List 复制下上篇博客中的工程,作为今天开发的工程. 一.参数绑定之数组 1. 需求 在商品列表页面选中多个商品,然后删除. 2. 需求分析 功能要求商 ...
- Windows下RabbitMQ安装及配置
下载rabbitmq_server以及Erlang OTP平台 安装好了启动服务就行了 也可用命令 net start RabbitMQ 或 net stop RabbitMQ 配置用户添加环境变 ...
- Orchard学习 02、orchard 路由
Orchard对mvc路由重新做了包装,重写了asp.net的路由模块 一.路由模块类图 1.路由 Descriptor RouteDescriptor是对常规mvc路由的包装类,它的Route属性就 ...
- oj提交时常见错误归纳
Presentation Error: 常见的PE错误应该有以下的几种情况: 每行输出之后有空行 每两行输出之间有空行 一行中,每个输出数字(或字符串,等)之间有空格 一行中,每个输出数字(或字符串, ...
- php 会话控制(Session会话控制)
php的session会话是通过唯一的会话ID来驱动的,会话ID是一个加密的随机数字,由php生成,在会话的生命周期中都会保存在客户端.客户端保存数据的地方只有cookie,所以php的会话ID一般保 ...