RDD的Action算子详细笔记,对比学习

本文详细介绍了Spark中的Action算子,包括countByKey、collect、reduce、fold、first、take、top、count、takeSample、takeOrdered、foreach、saveAsTextFile、mapPartitions、foreachPartition、partitionBy和repartition等,分析了它们的功能和使用场景。同时,文章探讨了groupByKey和reduceByKey在功能和性能上的区别,强调了reduceByKey在减少shuffle操作上的优势,从而提高计算效率。

Action算子

1.countByKey算子:统计key出现的次数(一般用在kv型RDD)

在这里插入图片描述

2.collect算子:将RDD各个分区的内容收集到Driver,形成一个list对象

在这里插入图片描述

3.reduce算子:对RDD数据按照你传入的逻辑进行聚合

在这里插入图片描述

4.fold算子:和reduce差不多,只是加上了一个初始值

在这里插入图片描述

5.first算子:就是取出第一个元素

在这里插入图片描述

<think>我们正在讨论SparkRDD算子。根据引用[1],RDD的主要特征包括分区、不可变性和并行操作。引用[2]提到了一些常用算子如map、flatMap、filter、distinct、sortBy和reduceByKey。引用[3]则展示了foreach和foreachPartition的用法,并建议使用分区级算子以提高效率。用户需求:了解RDD算子列表及使用方法回答结构:1.简要介绍RDD算子(转化和行动)2.分类列出常用算子,给出定义和示例3.提供使用建议(如引用[3]提到的分区级算子更高效)注意:所有数学表达式和代码块按指令处理。</think>### Spark RDD算子详解 Spark RDD算子分为**转化算子(Transformation)**和**行动算子Action)**两类。转化算子生成新RDD(惰性执行),行动算子触发计算并返回结果。以下是常用算子及用法: --- #### **一、常用转化算子(Transformation)** 1. **`map(func)`** - **功能**:对每个元素应用函数,返回新RDD - **示例**:`rdd.map(x => x * 2)` ```scala // 输入: [1,2,3] → 输出: [2,4,6] ``` 2. **`flatMap(func)`** - **功能**:先映射再扁平化(一对多) - **示例**:`rdd.flatMap(x => Array(x, x*10))` ```scala // 输入: [1,2] → 输出: [1,10,2,20] ``` 3. **`filter(func)`** - **功能**:过滤满足条件的元素 - **示例**:`rdd.filter(x => x > 5)` ```scala // 输入: [3,8,6] → 输出: [8,6] ``` 4. **`distinct([numPartitions])`** - **功能**:去重 - **示例**:`rdd.distinct()` ```scala // 输入: [1,3,3,2] → 输出: [1,3,2] ``` 5. **`reduceByKey(func, [numPartitions])`** - **功能**:按Key聚合(需键值对RDD) - **示例**:`pairRdd.reduceByKey(_ + _)` ```scala // 输入: [("a",1),("b",2),("a",3)] → 输出: [("a",4),("b",2)] ``` --- #### **二、常用行动算子Action)** 1. **`collect()`** - **功能**:返回所有元素到Driver程序 - **示例**:`rdd.collect() // 输出: Array(1,2,3)` 2. **`count()`** - **功能**:统计元素总数 - **示例**:`rdd.count() // 输出: 100` 3. **`foreach(func)`** - **功能**:遍历每个元素(无返回值) - **示例**(引用[3]): ```scala rdd.foreach(x => println(x * 10)) // 每个元素乘10后打印 ``` 4. **`foreachPartition(func)`** - **功能**:遍历每个分区(更高性能,推荐使用[^3]) - **示例**(引用[3]): ```scala rdd.foreachPartition(iter => iter.foreach(x => println(x * 10))) ``` 5. **`take(n)`** - **功能**:返回前n个元素 - **示例**:`rdd.take(3) // 输出: [1,2,3]` --- #### **三、关键优化建议** - **优先选择分区级算子**:如`mapPartitions`、`foreachPartition`比单元素算子(`map`/`foreach`)更高效,减少函数调用开销[^3]。 - **持久化中间结果**:对重复使用的RDD调用`persist()`避免重复计算。 - **控制分区数**:通过`repartition()`或`coalesce()`调整并行度。 > **注**:完整算子列表见[Spark官方文档](https://spark.apache.org/docs/latest/rdd-programming-guide.html#transformations)。 --- ###
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值