Spark处理过程-转换算子

转换算子

转换算子用于对 RDD 进行转换操作,生成一个新的 RDD。转换操作是惰性的,即当调用转换算子时,Spark 并不会立即执行计算,而是记录下操作步骤,直到遇到行动算子时才会触发实际的计算。

从格式和用法上来看,它就是集合对象的方法。

1.map 算子

作用 :对 RDD 中的每个元素应用给定的函数 f,将每个元素转换为另一个元素,最终返回一个新的 RDD。这个函数 f 接收一个输入类型为 T 的元素,返回一个类型为 U 的元素。

格式 :def mapU: ClassTag(f: T => U): RDDU

示例代码

java 复制代码
import org.apache.spark.{SparkConf, SparkContext}
object MapExample {
  def main(args: Array[String]): Unit = {
    val conf = new SparkConf().setAppName("MapExample").setMaster("local[*]")
    val sc = new SparkContext(conf)
    val rdd = sc.parallelize(Seq(1, 2, 3, 4))
    val newRdd = rdd.map(x => x * 2)
    newRdd.collect().foreach(println)
    sc.stop()
  }
}
2.filter 算子

作用 :筛选出 RDD 中满足函数 f 条件(即 f 函数返回 true)的元素,返回一个新的 RDD,新 RDD 中的元素类型与原 RDD 相同。

格式 :def filter(f: T => Boolean): RDDT

示例代码

java 复制代码
import org.apache.spark.{SparkConf, SparkContext}
object FilterExample {
  def main(args: Array[String]): Unit = {
    val conf = new SparkConf().setAppName("FilterExample").setMaster("local[*]")
    val sc = new SparkContext(conf)
    val rdd = sc.parallelize(Seq(1, 2, 3, 4))
    val newRdd = rdd.filter(x => x % 2 == 0)
    newRdd.collect().foreach(println)
    sc.stop()
}}
3.flatMap算子

作用 :对 RDD 中的每个元素应用函数 f,函数 f 返回一个可遍历的集合,然后将这些集合中的元素扁平化合并成一个新的 RDD。

格式 :def flatMapU: ClassTag(f: T => TraversableOnceU): RDDU

java 复制代码
import org.apache.spark.{SparkConf, SparkContext}
object FlatMapExample {
  def main(args: Array[String]): Unit = {
    val conf = new SparkConf().setAppName("FlatMapExample").setMaster("local[*]")
    val sc = new SparkContext(conf)
    val rdd = sc.parallelize(Seq("hello world", "spark is great"))
    val newRdd = rdd.flatMap(x => x.split(" "))
    newRdd.collect().foreach(println)
    sc.stop()
  }}
4.reduceByKey 算子

reduceByKey 是 Spark 中用于处理键值对(Key - Value)类型 RDD 的一个重要转换算子。它的核心作用是对具有相同键的所有值进行聚合操作,通过用户提供的聚合函数将这些值合并成一个结果,从而实现数据的归约和统计。例如统计每个键出现的次数、计算每个键对应值的总和、平均值等。

格式

def reduceByKey(func: (V, V) => V, numPartitions: Int): RDD(K, V)

参数说明:

func: (V, V) => V:这是一个二元函数,用于定义如何对相同键的值进行聚合。函数接收两个类型为 V 的值,返回一个类型为 V 的结果。例如,若要对相同键的值进行求和,func 可以是 (x, y) => x + y。

numPartitions: Int(可选):指定结果 RDD 的分区数。如果不提供该参数,将使用默认的分区数。

以下是一个使用 reduceByKey 计算每个单词出现次数的示例:

java 复制代码
import org.apache.spark.{SparkConf, SparkContext}
object ReduceByKeyExample {
  def main(args: Array[String]): Unit = {
    // 创建 SparkConf 对象
    val conf = new SparkConf().setAppName("ReduceByKeyExample").setMaster("local[*]")
    // 创建 SparkContext 对象
    val sc = new SparkContext(conf)

    // 创建一个包含单词的 RDD
    val words = sc.parallelize(List("apple", "banana", "apple", "cherry", "banana", "apple"))
    // 将每个单词映射为 (单词, 1) 的键值对
    val wordPairs = words.map(word => (word, 1))
    // 使用 reduceByKey 计算每个单词的出现次数
    val wordCounts = wordPairs.reduceByKey(_ + _)
    // 输出结果
    wordCounts.collect().foreach(println)
    // 停止 SparkContext
    sc.stop()
  }
}
相关推荐
天河归来5 小时前
第三方接口不稳定,如何让核心任务继续完成
java·大数据
GlobalInfo7 小时前
2026年全球机器人用超平执行器市场研究报告:市场规模达7.51亿美元,人形机器人商业化与轻量化运动控制需求推动行业增长
大数据·人工智能·数码相机·microsoft·机器人
IT古董8 小时前
《Agent开发工程师成长指南》- 第4章 第2节:Prompt设计五要素——任务、角色、上下文、约束与输出格式
大数据·人工智能·prompt
8Qi810 小时前
DDD架构演进
java·分布式·mvc·ddd
方方洛10 小时前
ray教程-23-附录C-术语表
人工智能·分布式·机器学习
Allen_LVyingbo10 小时前
NVIDIA CUDA Tile 在医疗计算中的算子形式化、算法重构与内核实现
大数据·python·算法·重构·知识图谱·健康医疗·数据库架构
全栈陈序员11 小时前
【Git】从入门到精通(一)—— Git简介:什么是版本控制系统
大数据·git·elasticsearch
中国搜索直付通11 小时前
分账系统有风险吗?资金安全怎么保障?
大数据·支付通道·分账系统·分账支付
一枕槐安48712 小时前
微调 vs Prompt:业务场景下两种方案成本 & 效果对比
大数据·人工智能·prompt·混合架构·推理成本·行为固化·知识边界
SelectDB12 小时前
Apache Doris 与 SelectDB 是什么关系?从开源技术到面向 Agent 的极速分析数据库
大数据·数据库·数据分析