RDD编程基础知识

一、RDD编程基础
1、RDD创建

Spark采用textFile()方法从文件系统中加载数据创建RDD,该方法把文件的URI作为参数,这个URI可以是本地文件系统的地址、分布式文件系统HDFS的地址或者是AmazonS3地址等。

(1)从文件系统中加载数据

 


(2)从分布式文件系统HDFS中加载数据

 

 

(3)通过并行集合(列表)创建RDD

 

 

2.RDD操作

RDD操作包含两种类型,即转换(Transformation)操作和行动(Action)操作

(1)转换操作

操作 含义
filter(func) 筛选出满足函数func的元素,并返回一个新的数据集
map(func) 将每个元素传递到函数func中,并将结果返回为一个新的数据集
flatMap(func) 与map()相识,但每个输入元素都可以映射到0或多个输出结果
groupByKey() 应用于(K,V)键值对的数据集时,返回一个新的(K,Iterable)形式的数据集
reduceByKey(func) 应用于(K,V)键值对的数据集时,返回一个新的(K,K)形式的数据集,其中每个值是将每个key传递到函数func中进行聚合后的结果
例:

filter()

 


map()

 


flatMap()
"flat"是一个很形象的动作-----“拍扁”,也就是把wordArray中的每个RDD元素都“拍扁”成多个元素,所有这些被拍扁以后得到的元素,构成一个新的RDD。

 

 

groupByKey()

 


reduceByKey()

 


(2)行动操作

行动操作是真正触发计算的地方。Spark程序只有执行到行动操作时,才会执行真正的计算,从文件中加载数据,完成一次又一次转换操作,最终,完成行动操作得到结果。

操作 含义
count() 返回数据集中的元素个数
collect() 以数组的形式返回数据集中的所有元素
first() 返回数据集中的第1个元素
take(n) 以数组的形式返回数据集中的前n个元素
reduce(func) 通过函数func(输入两个参数并返回一个值)聚合数据集中的元素
foreach(func) 将数据集中的每个元素传递到函数func中运行

 


3.惰性机制

惰性机制是指整个转换过程只是记录了转换的轨迹,并不会发生真正的计算,只有遇到行动操作时,才会触发“从头到尾”的真正计算。

4.持久化

我们知道RDD采用惰性机制,这对于迭代计算而言,代价是很大的,因为迭代计算经常需要多次重复使用同一组数据。

为了解决这一问题,我们可以通过持久化(缓存)机制来避免这种重复计算的开销。具体方法是使用persist()方法将一个RDD标记为持久化。

一般而言,使用cache()方法时,会调用persist()。
持久化RDD会占用内存空间,当不再需要一个RDD时,就可以使用unpersist()方法手动地把持久化的RDD从缓存中移除,释放内存空间。

 

 

很明显时间缩短了很多。

5.分区

(1)分区的作用

RDD是弹性分布式数据集,通常RDD很大,会被分成很多个分区,分别保存在不同的节点上。

对RDD进行分区,第一个作用是增加并行度。

 

 

如:rdd2的3个分区p6、p7、p8,分布在3个不同的工作节点WorkerNode2、WorkerNode3、WorkerNode4上,就可以在这三个工作节点分别启动3个线程对这3个分区的数据进行并行处理,增加任务的并行度。

第二个作用是减少通信开销。

(2)分区的原则

RDD分区的一个原则是时得分区的个数尽量等于集群中CPU核心(Core)数目。对于不同的Spark部署模式,都可以通过设置spark.default.parallelism这个参数的值,来配置默认的分区数目。

设置分区的个数

创建RDD时手动指定分区个数

sc.textFile(path,partitionNum)
#path参数用于指定加载的文件的地址,partitionNum参数用于指定分区个数

sc.textFile(path,partitionNum)
#path参数用于指定加载的文件的地址,partitionNum参数用于指定分区个数

使用repartition方法重新设置分区个数

 

自定义分区方法

Spark提供了自带的HashPartition(哈希分区)与RangePartition(区域分区),能够满足大多数应用场景的需求。

二、键值对RDD
键值对RDD是指每个RDD元素都是(Key,Values)键值对类型,是一种常见的RDD类型,可以应用于很多场景。

1.键值对RDD的创建

键值对RDD的创建主要有两种方式:从文件中加载生成RDD;通过并行集合(列表)创建RDD。

这和上面RDD创建类似,就是我们要对每个key值赋一个values。

例:

 

 

2.常用的键值对转换操作

reduceByKey()和groupByKey()上面已经介绍过,接下来介绍:

keys、values、sortByKey()、sortBy()、mapValues(func)、join()等

keys
键值对RDD每个元素都是(Key,Values)的形式,keys方法啊只会把键值对RDD中的key返回,形成一个新的RDD。

 


values
values操作只会把键值对RDD中的values返回,形成一个新的RDD。

 

 

sortByKey()

sortByKey()的功能是返回一个根据key排序的RDD。

 

 

sortBy()

可以根据其他字段进行排序。

 

 

mapValues(func)
mapValues(func)对键值对RDD中每个value都应用一个函数,但是,key不会发生变化。

 

join()
join表示内连接,对于给定的两个输入数据集(K,V1),(K,V2),只有在两个数据集中都存在的key才会被输出,最终得到一个(K,(V1,V2))类型的数据集。

 参考:https://blog.csdn.net/m0_46917254/article/details/123682747

posted @ 2024-01-20 23:15  伽澄  阅读(60)  评论(0编辑  收藏  举报