在scala中,转换算子和行动算子有什么区别
在Scala结合Spark编程中,转换算子(Transformation)和行动算子(Action)有以下区别:
执行机制
**转换算子**:
具有惰性求值(延迟计算)特性 。它对RDD(弹性分布式数据集)进行转换操作,从一个RDD生成另一个RDD,但这些操作不会立即执行,而是构建一个操作 lineage(血缘关系),等到遇到行动算子时才会真正触发计算。
例如 `map` 算子将RDD中每个元素应用给定函数转换为新元素, `filter` 算子按条件过滤元素等,在代码中写了这些算子时,实际计算不会马上开始 。
**行动算子**:
会立即触发计算。一旦程序执行到行动算子,Spark会根据之前转换算子构建的操作 lineage,将作业提交到集群进行计算,并将结果返回给驱动程序或输出到外部系统 。
功能用途
**转换算子**:
主要用于对数据进行各种转换处理,为后续计算做准备。像通过 `map` 对数据进行格式转换、计算新值;用 `filter` 筛选符合条件的数据; `union` 合并多个RDD等 。
**行动算子**:
用于获取最终计算结果或进行输出操作。比如 `count` 统计RDD中元素个数, `collect` 将RDD所有元素拉取到Driver端, `saveAsTextFile` 把RDD数据保存为文本文件 。
返回结果
**转换算子**:
返回新的RDD 。新RDD逻辑上是经过转换操作后的数据集合,但此时并未实际计算出数据。
**行动算子**:
根据算子功能不同,返回具体的值或执行输出动作。如 `count` 返回元素数量(数值), `collect` 返回包含RDD元素的数组 。
常见算子举例
**转换算子**:`map`、`filter`、`flatMap`、`distinct`、`groupBy`、`union` 等。
**行动算子**:`count`、`collect`、`reduce`、`first`、`take`、`saveAsTextFile` 等 。