什么是RDD
RDD 是 Spark 的计算模型。RDD(Resilient Distributed Dataset)叫做弹性的分布式数
据集合,是 Spark 中最基本的数据抽象,它代表一个不可变、只读的,被分区的数据集。
操作 RDD 就像操作本地集合一样,有很多的方法可以调用,使用方便,而无需关心底层的
调度细节。
RDD宽依赖:父RDD的分区被子RDD的多个分区使用 例如 groupByKey、reduceByKey、sortByKey等操作会产生宽依赖,会产生shuffle
RDD窄依赖:父RDD的每个分区都只被子RDD的一个分区使用 例如map、filter、union等操作会产生窄依赖
RDD的三种创建形式
- 集合并行化创建(通过 scala 集合创建) scala 中的本地集合—> spark RDD
val arr = Array(1,2,3,4,5
val rdd = sc.parallelize(arr)
val rdd =sc.makeRDD(arr)
通过集合并行化方式创建 RDD,适用于本地测试,做实验 - 读取外部文件系统,比如 HDFS 等
val rdd2 = sc.textFile(“hdfs://hdp-01:9000/words.txt”)
// 读取本地文件
val rdd2 = sc.textFile(“file:///root/words.txt”) // 文件的前缀,可加可不加 - rdd之间的转换
已存在的rdd,经过调用转换类的算子,生成一个新的rdd
RDD上的算子
主要分两类
Transformation:延时计算,不会触发计算,懒加载
lazy 执行的,并没有立即去执行,例如一些方法,map方法,仅仅是记录了传递的函数的操作。
当transformation算子遇到action算子的时候,才开始触发任务的执行
每一次的transformation算子,都生成一个新的rdd。
Action:立即执行计算
每次遇到一个action,就会产生一个job。
要么把结果写入到文件系统中,要么把结果展示在driver端,要么把结果打印。
Application:
在每一个application中,有几个action,就会产生几个job。
常用算子
-
Transformation 懒加载 不会将操作递交到集群
map:返回一个新的RDD,该RDD由每一个输入元素经过func函数转换后组成
flatMap:压平操作,先map后flat
filter:过滤(返回一个新的RDD,该RDD由经过func函数计算后返回值为true的输入元素组成)
union:并集(对原RDD和参数RDD求并集后返回一个新的RDD)
intersection:交集(对原RDD和参数RDD求交集后返回一个新的RDD)
distinct:(对源RDD进行去重后返回一个新的RDD)
groupBy:分组
sortBy:排序 -
Action
collect:收集,将数据收集到Driver端
saveAsTextFile:保存文件
count:求个数
first:第一个元素
take:求集合中的n个元素
foreach:对原来的rdd中的每隔元素,执行fun操作
foreach和map的区别:
1:foreach没有返回值,map有返回值
2:foreach是action操作,会触发计算,map是tranformation操作