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