常用RDD算子讲解(Scala语言)

一、目标
  1. 理解 RDD 的算子分类, 以及其特性

  2. 理解常见算子的使用

二、分类

RDD 中的算子从功能上分为两大类

  1. Transformation(转换) 它会在一个已经存在的 RDD 上创建一个新的 RDD, 将旧的 RDD 的数据转换为另外一种形式后放入新的 RDD

  2. Action(动作) 执行各个分区的计算任务, 将的到的结果返回到 Driver 中

RDD 中可以存放各种类型的数据, 那么对于不同类型的数据, RDD 又可以分为三类

  • 针对基础类型(例如 String)处理的普通算子

  • 针对 Key-Value 数据处理的 byKey 算子

  • 针对数字类型数据处理的计算算子

三、特点
  • Spark 中所有的 Transformations 是 Lazy(惰性) 的, 它们不会立即执行获得结果. 相反, 它们只会记录在数据集上要应用的操作. 只有当需要返回结果给 Driver 时, 才会执行这些操作, 通过 DAGScheduler 和 TaskScheduler 分发到集群中运行, 这个特性叫做 惰性求值

  • 默认情况下, 每一个 Action 运行的时候, 其所关联的所有 Transformation RDD 都会重新计算, 但是也可以使用 presist 方法将 RDD 持久化到磁盘或者内存中. 这个时候为了下次可以更快的访问, 会把数据保存到集群上.

四、常见的Transformations 算子

Transformation function

解释

map(T ⇒ U)

// 创建一个并行化的数据集,数据来源于 Seq(1, 2, 3)
sc.parallelize(Seq(1, 2, 3))  
// 对数据集中的每个元素进行映射操作,将每个元素乘以 10
.map( num => num * 10 )  
// 收集处理后的结果
.collect()  

57c2f77284bfa8f99ade091fdd7e9f83

c59d44296918b864a975ebbeb60d4c04

作用

  • 把 RDD 中的数据 一对一 的转为另一种形式

签名

def map[U: ClassTag](f: T ⇒ U): RDD[U]

参数

  • f → Map 算子是 原RDD → 新RDD 的过程, 传入函数的参数是原 RDD 数据, 返回值是经过函数转换的新 RDD 的数据

注意点

  • Map 是一对一, 如果函数是 String → Array[String] 则新的 RDD 中每条数据就是一个数组

flatMap(T ⇒ List[U])

// 创建一个并行化的数据集,数据来源于包含三个字符串的 Seq
sc.parallelize(Seq("Hello lily", "Hello lucy", "Hello tim"))  
// 对数据集中的每个字符串按照空格分割成单词,并将这些单词展平为一个新的序列
.flatMap( line => line.split(" ") )  
// 收集处理后的结果
.collect()  

ec39594f30ca4d59e2ef5cdc60387866

f6c4feba14bb71372aa0cb678067c6a8

作用

  • FlatMap 算子和 Map 算子类似, 但是 FlatMap 是一对多

调用

def flatMap[U: ClassTag](f: T ⇒ List[U]): RDD[U]

参数

  • f → 参数是原 RDD 数据, 返回值是经过函数转换的新 RDD 的数据, 需要注意的是返回值是一个集合, 集合中的数据会被展平后再放入新的 RDD

注意点

  • flatMap 其实是两个操作, 是 map + flatten, 也就是先转换, 后把转换而来的 List 展开

  • Spark 中并没有直接展平 RDD 中数组的算子, 可以使用 flatMap 做这件事

filter(T ⇒ Boolean)

// 创建一个并行化的数据集,数据来源于包含 1、2、3 的 Seq
sc.parallelize(Seq(1, 2, 3))  
// 表示只保留值大于等于 3 的元素
.filter( value => value >= 3 )  
// 收集筛选后的结果
.collect() 

25a7aef5e2b8a39145d503f4652cc945

05cdb79abd41a7b5baa41a4c62870d73

作用

  • Filter 算子的主要作用是过滤掉不需要的内容

mapPartitions(List[T] ⇒ List[U])

RDD[T] ⇒ RDD[U] 和 map 类似, 但是针对整个分区的数据转换

mapPartitionsWithIndex

和 mapPartitions 类似, 只是在函数中增加了分区的 Index

mapValues

// 创建一个并行化的数据集,数据来源于包含键值对的 Seq
sc.parallelize(Seq(("a", 1), ("b", 2), ("c", 3)))  
// 对数据集中的每个键值对,仅对值进行映射操作,将值乘以 10
.mapValues( value => value * 10 )  
// 收集处理后的结果
.collect()  

7a8b280a054fdab8e8d14549f67b85f9

5551847febe453b134f3a4009df01bec

作用

  • MapValues 只能作用于 Key-Value 型数据, 和 Map 类似, 也是使用函数按照转换数据, 不同点是 MapValues 只转换 Key-Value 中的 Value

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值