为什么spark中叫算子不叫方法以及算子之间的区别

博客探讨了在Spark中为何将RDD的操作称为算子而非方法。算子在Executor中执行,与scala集合对象的方法在Driver端执行不同,这导致了执行顺序和数据有序性的区别。例如,foreach和collect分别在Execute端和Driver端执行,前者可能导致乱序输出,而后者则保证有序。此外,算子与接口IndexedSeqOptimized的方法也有所区分。

今天博主在学习spark中一直在用算子,突然很困惑为什么要叫算子而不是方法呢?
答:
算子:(Operation)
是为了区分和scala集合对象的方法,集合对象的方法都是在同一个节点中完成的,RDD的方法也就是算子都是在Executor中执行,为了区分两者,所以称之为算子。

foreachcollect.foreach
Execute端执行操做在driver端执执行操作
每个Execute进行输出,所以乱序Execute端反馈给driver,driver端进行整合输出,所以是有序
类RDD的方法接口IndexedSeqOptimized的方法
# Spark中转换算子(Transformations)与行动算子(Actions)的主要区别 ## 1. 执行机制差异 - **转换算子**:是惰性执行的(Lazy Evaluation),只记录转换关系立即计算 ```scala val mapped = rdd.map(_ * 2) // 此时会真正计算 ``` - **行动算子**:触发实际计算,生成Job并提交执行 ```scala mapped.count() // 触发整个DAG的执行 ``` ## 2. 返回值类型 - **转换算子**:返回新的RDD/Dataset/DataFrame ```scala val filtered: RDD[Int] = rdd.filter(_ > 10) ``` - **行动算子**:返回非RDD值(标量或集合) ```scala val cnt: Long = rdd.count() // 返回Long类型 ``` ## 3. 数据流动方向 - **转换算子**:数据在集群内流动(分布式处理) - **行动算子**:数据可能被收集到Driver端 ```scala val arr: Array[Int] = rdd.collect() // 数据返回到Driver ``` ## 4. 触发点 - **转换算子**:构建DAG(有向无环图)的执行计划 - **行动算子**:是整个执行计划的触发器 ## 5. 典型算子对比 | 类别 | 转换算子示例 | 行动算子示例 | |------------|-----------------------------|------------------------| | 基本操作 | map, filter, flatMap | count, collect | | 聚合操作 | reduceByKey, groupByKey | reduce, aggregate | | 集合操作 | union, intersection | take, first | | 排序操作 | sortBy, repartitionAndSort | top, takeOrdered | ## 6. 性能影响 - **转换算子**:仅定义计算逻辑,影响性能 - **行动算子**:实际消耗资源,可能产生Shuffle ```scala // 完整示例:转换算子链式调用+行动算子触发 val result = sc.parallelize(1 to 100) .filter(_ % 2 == 0) // 转换 .map(_ * 3) // 转换 .reduce(_ + _) // 行动(触发计算) ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

布丁味

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值