Spark RDD的fold和aggregate为什么是两个API?为什么不是一个foldLeft?

【研究生学术英语读写教程翻译 中国科学院大学Unit9】 Unit 9 If Humble People Make the Best Leaders,Why Do We Fall for Charismatic Narcissists? 如果谦逊的人是最好的领导者,为什么我们会爱上魅力型自恋者? 阅读详情

欢迎关注我的新博客地址:http://cuipengfei.me/blog/2014/10/31/spark-fold-aggregate-why-not-foldleft/

大家都知道Scala标准库的List有一个用来做聚合操作的foldLeft方法。

比如我定义一个公司类:

1
case class Company(name:String, children:Seq[Company]=Nil)

它有名字和子公司。 然后定义几个公司:

1
val companies = List(Company("B"),Company("A"),Company("T"))

三家大公司,然后呢,我假设有一家超牛逼的公司把它们给合并了:

1
companies.foldLeft(Company("King"))((king,company)=>Company(name=king.name,king.children:+company))

这个执行的结果是这样的:

1
2
scala> companies.foldLeft(Company("King"))((king,company)=>Company(name=king.name,king.children:+company))
res6: Company = Company(King,List(Company(B,List()), Company(A,List()), Company(T,List())))

可见foldLeft的结果是一家包含了BAT三大家得新公司。

由List[Company]聚合出一个新的Company,这种属于foldLeft的同构聚合操作。

同时,foldLeft也可以做异构的聚合操作:

1
companies.foldLeft("")((acc,company)=>acc+company.name)

它的执行结果是这样的:

1
2
scala> companies.foldLeft("")((acc,company)=>acc+company.name)
res7: String = BAT

由List[Company]聚合出一个String。

这样的API感觉很方便,只要是聚合,无论同构异构,都可以用它来做。

最近接触了Spark,其中的RDD是做分布式计算时最常用的一个类。

RDD有一个叫做fold的API,它和foldLeft的签名很像,唯一区别是它只能做同构聚合操作。

也就是说如果你有一个RDD[X],通过fold,你只能构造出一个X。

如果我想通过一个RDD[X]构造一个Y出来呢?

那就得用aggregate这个API了,aggregate的签名是这样的:

1
aggregate[U](zeroValue: U)(seqOp: (U, T) ⇒ U, combOp: (U, U) ⇒ U)(implicit arg0: ClassTag[U]): U

它比fold和foldLeft多需要一个combOp做参数。

这让我很不解,同构和异构的API干嘛非得拆成两个呢?怎么不能学Scala的标准库,把它做成类似foldLeft的样子呢?

后来想明白了,这是由于Spark需要分布运算造成的。

先想一下Scala List的foldLeft是怎么工作的?

1
companies.foldLeft(Company("King"))((king,company)=>Company(name=king.name,king.children:+company))
  1. 拿到初始值,即名字为king的公司,把它和list中的第一个公司合并,成为一个包含一家子公司的新公司
  2. 把上一步中的新公司拿来和list中的第二个公司合并,成为一个包含两家子公司的新公司
  3. 把上一步中的新公司拿来和list中的第三个公司合并,成为一个包含三家子公司的新公司

这是同构的过程。

1
companies.foldLeft("")((acc,company)=>acc+company.name)
  1. 拿到初始值,即空字符串,把它和list中的第一个公司的名字拼在一起,成为B
  2. 把上一步中的B第二个公司名字拼一起,成为BA
  3. 把上一步中的BA拿来和list中的第三个公司的名字拼一起,成为BAT

这是异构的过程。

像多米诺骨牌一样,从左到右依次把list中的元素吸收入结果中。

现在假设RDD[X]中有一个类似foldLeft的API,其签名和foldLeft一致,我现在调用foldLeft,给它一个f:(Y,X)=>Y,接下来该发生什么呢?

  1. 因为要分布计算,所以我先要把手里的很多个X分成几份,分发到不同的节点上去
  2. 每个节点把拿到的很多个X计算出一个Y出来
  3. 把所有节点的结果拿来,这时我手里就有了很多个Y
  4. 啊。。。我不知道怎么把很多个Y变成一个Y啊。。。

由于Spark的RDD不像Scala的List一样只需要推倒一副多米诺骨牌,而是要推倒很多副,最后再对很多副多米诺骨牌的结果做聚合。

这时如果是同构还好,我只需要再用f:(X,X)=>X做一遍就ok了。

但是如果是异构的,那我就必须得再需要一个f:(Y,Y)=>Y了。

生成式AI;语义通信技术;生成式AI辅助的云边协同算法及其可解释性 生成式AI 语义通信技术 生成式AI辅助的云边协同算法及其可解释性 一、端到端设计的物理层内生智能 二、生成式语义通信 三、生成式数字孪生网络 四、生成式AI辅助的云边协同算法及其可解释性 五、未来可能的研究方向 阅读详情

相关推荐

【AI深究】合成数据(Synthetic Data)深度解析:原理、算法与工程实践——全网最详细流程|核心原理、主流方法、数学表达、工程实践与细节、未来趋势|GAN、VAE、语言模型LLM合成如GPT

大家好,我是爱酱。本篇延续将会系统梳理合成数据(Synthetic Data)的核心原理、主流方法、数学表达、工程实践与未来趋势,结合数学公式,帮助你全面理解这一AI建模的关键技术。 注:本文章含大量数学算式、详细例子说明及大量代码演示,大量干货,建议先收藏再慢慢观看理解。新频道发展不易,你们的每个赞、收藏跟转发都是我继续分享的动力!

AI人工智能爱酱~你的AI学习好帮手~ 4933

Kotlin | 高阶函数reduce()、fold()详解

reduce()适用于不需要初始值的聚合操作,fold()适用于需要初始值的聚合操作。reduce()操作可以直接返回聚合后的结果,而fold()操作需要通过lambda表达式的返回值来更新累加器的值。在使用时,需要根据具体场景来选择使用哪个函数。

小马快跑的博客 2651

手把手教你驱动6脚三位一体数码管:从引脚分析到C语言扫描代码实战

本文详细解析了如何逆向工程并驱动6脚三位一体数码管的全过程,从引脚分析到C语言扫描代码实战。通过系统化的测试和优化,作者总结出一套高效的驱动架构和调试方法,适用于工业设备中的非标准数码管应用。

weixin_42632434的博客 213

Scala学习笔记——reduce、fold、scan

Scala学习笔记之reduce、fold、scan 文章目录`Scala`学习笔记之`reduce`、`fold`、`scan``1. reduce化简`概念与区别:示例:`1.` 计算给定集合的元素和:`2.` 计算`n!`:`2. fold折叠`概念与区别:示例:`1.` 计算`n!`(`reduce`的优化):`2.` 统计字符串中每个字符出现的频次:`3. scan扫描`概念与区别: ...

Au的博客 3810

“迎圣诞,拿大奖” 活动赛题 Web-SQLi

1. php中sprintf()函数漏洞原理及其利用; 2. mysql盲注语法及python脚本; 3. sqlmap的需要进一步学习;

qq_34106499的博客 674

H无穷控制学习笔记——加权灵敏度H无穷控制问题

一、加权灵敏度H无穷问题 系统结构如上图所示。被控对象P的状态空间方程为(Ap,Bp,Cp,DpA_p,B_p,C_p,D_pAp​,Bp​,Cp​,Dp​),加权函数W1的状态空间方程为(A1,B1,C1,D1A_1,B_1,C_1,D_1A1​,B1​,C1​,D1​),加权函数W2的状态空间方程为(A2,B2,C2,D2A_2,B_2,C_2,D_2A2​,B2​,C2​,D2​),加权函数W3的状态空间方程为(A3,B3,C3,D3A_3,B_3,C_3,D_3A3​,B3​,C3​,D3​)。

一饮丶一啄的博客 4350

[Kotlin 开发] reduce和fold的区别

1.先写个小例子 reduce println((0..5).reduce { acc, i -> Log.e("reduce ====","acc:"+acc+" i:" + i) acc + i }) // 输出结果: // E/reduce ====: acc:0 i:1 // E/reduce ====: acc:1 i:2 // E/reduce ====: acc:3 i:3 // E/reduce ====: acc:6 i:4 // E/reduce ====:

u010130947的专栏 2098

服务器被攻击植入挖矿病毒,CPU占用高问题排查处理(.systemd-service.sh)

客户服务器遭攻击,部署的应用服务经常性被停止,服务器CPU占用居高不下,top查看如下: 可以看到第一个bash任务,占用cpu近400%,非正常的应用程序和脚本任务,多半是被植入了木马信息。 查看该进程的符号连接,发现已经是被删除的状态 /usr/bin/-bash (deleted),无法查看其启动程序的信息 查看定时任务:cat /etc/crontab,发现都是正常的应用程序定时脚本 又用 crontab -l 查看了一下,发现了异常定时任务如下,同top里的异常任务一致...

gottst0113的博客 2121

RDD之fold()方法

RDD之fold()方法 简述: fold()和reduce()一样的,但是fold()需要提供初始值。 直接看代码: //分成2个区 JavaRDD<Integer> numRdd= sc.parallelize(Arrays.asList(1,2,3,4),2); //fold注意:计算每个分区之后还要合并分区结果,合并时也需要加上初始值 Integer fold = numRdd.fold(10, new Function2&

weixin_45264992的博客 478

LabVIEW新手必看:5分钟搞定S7-1200 OPC通信(附完整配置截图)

本文详细介绍了LabVIEW与西门子S7-1200 PLC通过OPC通信实现工业监控系统的完整配置流程。从环境准备、PLC数据块配置到OPC Server高级设置,逐步指导新手快速建立稳定通信链路,并分享工业级应用的优化技巧和异常处理方案,帮助用户提升自动化系统集成效率。

rl6adventurer的博客 641

Windows 11下JDK 21与JMeter 5.6.3环境配置全攻略

环境变量是操作系统管理软件路径与执行权限的核心机制,它通过预设的键值对,指引系统在调用命令时定位可执行文件。理解其工作原理,是解决软件安装后“命令未找到”等问题的关键。对于Java生态而言,正确配置JAVA_HOME和Path变量,不仅能让java、javac等基础命令全局可用,更是Maven、Gradle乃至JMeter等众多工具链顺畅运行的基石。JMeter作为一款基于Java开发的经典性能测试与接口测试工具,其稳定运行高度依赖健全的Java环境。本文聚焦于在Windows 11系统上,为JDK 21与

weixin_30940783的博客 451

learning-spark学习笔记(2):reduce()、fold()和aggregate()的区别

reduce()、fold()和aggregate()都是在spark中对RDD的聚合操作,在理解这几个函数的时候费了一点劲 reduce()和fold()要求操作的RDD是同种类型,也就是操作的元素类型和返回的元素类型一致 temp = sc.parallelize([1,2,3,4]) sum = temp.reduce(lambda x, y: x + y) 注意这里x指的是这...

sdoddyjm68的博客 2922

RK3568平台(USB篇)USB基础知识

现象:把USB设备比如Android手机接到PC答1:是USB控制器,是USB控制器内嵌的root hub.答2. windows里已经有了USB的总线驱动程序,接入USB设备后,是"总线驱动程序"知道你是"android phone"提示你安装的是"设备驱动程序"。USB总线驱动程序负责:识别USB设备, 给USB设备找到对应的驱动程序。答3. PC的USB口内部,D-和D+接有15K的下拉电阻,未接USB设备时为低电平USB设备的USB口内部,D-或D+接有1.5K的上拉电阻;

weixin_49303682的博客 1658

fold函数_Java中使用Map and Fold进行函数式编程

fold函数 在函数式编程中,Map和Fold是两个非常有用的运算符,它们属于每种函数式语言。 如果Map和Fold运算符是如此强大且必不可少,那么您如何解释说即使Java编程语言缺少这两个运算符,我们也可以使用Java来完成工作? 事实是,使用Java进行编码时,您已经进行了Map和Fold,只是每次都使用循环手动进行操作。 免责声明:我不是函数式编程的参考,本文不过是一个简短的介绍。 F...

最佳 Java 编程 934

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

Spark基础知识20_Scala遍历操作,map和flatMap操作、fliter、reduce、fold

对lambda表达式含义的解释--->遍历到的元素赋值给s,然后让s去执行后续方法,这样就可以一个一个转换掉,此例中,会把值给s,然后执行.toUpperCase方法,然后再遍历,再执行下去.朗母达表达式,匿名函数case模式匹配,kv._1表示匹配的键,kv._2表示的匹配的值,这是元组的表达方式,这些遍历方法都可以去尝试。10 作为初始的s ,10 * 1,10 * 2, 20 * 3 ,60 * 4,240 *5。这些元素就构成了很大的集合,得到非常多的元素构成的整体的集合,就是我们所要的结果。

Matrix70的博客 1684

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

Spark编程之基本的RDD算子之fold,foldByKey,treeAggregate, treeReduce

Spark编程之基本的RDD算子之fold,foldByKey,treeAggregate, treeReduce 1) fold def fold(zeroValue: T)(op: (T, T) => T): T这个api算子接收一个初始值,fold算子传入一个函数,合并两个同类型的值,同时返回一个相同类型的值这个算子在每个分区对值进行合并。在每个分区合并时以一个zeroValue作为在每个在每

stevekangpei的博客 818

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

Scala中,reduce, fold, 和 sorted

: 这个函数主要用于将集合中的元素通过某种累积规则(比如加法、乘法、最大值查找等)组合成单个结果。它从左到右遍历集合,并应用给定的二元操作函数(如。:这个函数用于返回一个排序后的集合副本,原集合不会改变。对于List,SortedSet或SortedMap,,但是从右到左遍历集合。这个在某些上下文中可能会更自然,尤其是当操作需要在每个元素上依赖之前的结果时。直接按元素自然顺序排序;而对于自定义类型的序列,需要提供一个比较器(Comparator)。

2401_82366115的博客 525

Spark核心之aggregate和fold

在本文中介绍Spark中Action的两种算子,分别是aggregate和fold,其方法定义分别为: • aggregate[U](zeroValue: U)(seqOp: (U, T) => U, combOp: (U, U) => U)(implicit argO: ClassTag[U]): U • fold(zero Value: T)(op: (T, T) =...

LMR的博客 9625

函数式编程里面的fold

第一:基本概念 fold在函数式编程里面的基本含义是遍历数据结构,最后产生一个聚合值。最简单的例子是sum list = foldl (+) 0 list fold抽象了两个动作,一个是遍历数据结构本身,一个是累积值和元素之间的关系。用了fold后就只需要关心聚合的初始值是什么,每个元素和累积值如何产生下一个累积值。 比如上面的sum的例子,初始值是0, 步进函数式+, 也就是每个元

在理想和现实之间来回碰撞的程序员 4897

Kotlin 中 fold 和 reduce 的基本区别是什么

在 Kotlin 中都是强大的聚合操作函数,但在使用时需要根据具体情况选择合适的函数。如果需要一个初始值来确保结果的类型或者处理空集合的情况,在这个例子中,初始值为 0,每次迭代将累加器和列表中的元素相加,最终得到列表元素的总和。同样对于计算整数列表中所有元素的总和,如果确定列表不为空,可以使用。这里直接对列表中的两个元素进行操作,逐步将结果累加到最终的总和。假设我们有一个整数列表,想要计算列表中所有元素的总和,可以使用。如果集合不为空且不需要初始值,在 Kotlin 中,可以提供更简洁的语法。

challenge51all的专栏 822

fold函数和reduce函数的区别(不特指spark)

In a fold over a collection, the accumulator type may be different than the type of the collection, and a zero element is usually given. In a reduce, you don't give a zero element and the accumulato

点火三周的专栏 4122

scala练习——fold函数

题目 用fold方法将数组中的每个列表相同下标的元素进行聚合。 数据:Array(List(2,3,4), List(1,2,3), List(4,5,6)) 结果为:Array(7,10,13) 解析 fold函数,英文翻译意为折叠,其源代码如下: def fold[A1 >: A](z: A1)(op: (A1, A1) => A1): A1 = foldLeft(z)(op) //该函数有两个参数,且后一个参数为一个函数,两个参数是采用柯里化联合到一起的。后面调回的是 //foldL

yeah_you_are的博客 897

Spark算子[11]:reduce、aggregate、fold 详解

以上三个方法操作都是对RDD进行的聚合操作。1、reduce()与fold()方法是对同种元素类型数据的RDD进行操作,即必须同构。其返回值返回一个同样类型的新元素。val nums = Array(1,2,3,4,5,6,7,8,9) val numsRdd = sc.parallelize(nums,3) val reduce = numsRdd.reduce((a,b) => a+b)2、fo

行走的树 3108

Scala高阶函数之 map, reduce, flatMap(扁平化), fold(折叠), scan(扫描)

高阶函数: 高阶函数是指使用其他函数作为参数、或者返回一个函数作为结果的函数。在Scala中函数是“一等公民”,所以允许定义高阶函数。这里的术语可能有点让人困惑,我们约定,使用函数值作为参数,或者返回值为函数值的“函数”和“方法”,均称之为“高阶函数”。 最常见的一个例子是Scala集合类(collections)的高阶函数map object HighOrderFunDemo02 { def...

李昊轩的博客 1965

fold函数如何使用与如何用fold函数求最小值

【代码】fold函数如何使用与如何用fold函数求最小值。

CYLktiao的博客 211
上一篇: Scala中Stream的应用场景及其实现原理
下一篇: 15篇干货博客 38本书 4门公开课 减掉20斤体重 我的2014总结
崔鹏飞
博客等级 码龄19年 441粉丝 128原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值