因为转换算子都是懒加载,并不会立即执行,遇到行动算子才执行。
目录
1.reduce()
聚合,f函数聚集RDD中的所有元素,先聚合分区内数据,再聚合分区间数据。
val listRDD: RDD[Int] = sc.makeRDD(List(1, 2, 3, 4),2)
// 行动算子
// reduce
// 有分区内和分区间的计算逻辑 分区内按照元素的前后顺序计算 第一个元素作为初始值
// 分区间不一定 按照哪个分区先算完哪个分区作为初始值
val i: Int = listRDD.reduce(_ -_)
println(i)
2.collect()
在驱动程序中,以数组Array的形式返回数据集的所有元素。
3.count()
返回RDD中元素的个数
//count 统计RDD的个数
val l: Long = listRDD.count()
println(l)
4.first()
返回RDD中的第一个元素
// first取第一个元素的时候 一定取0号分区的数据
val i: Int = listRDD.first()
println(i)
5.take()
返回一个由RDD的前n个元素组成的数组
// take能够识别具体是哪个分区的数据 从0号分区开始取数据
val ints: Array[Int] = listRDD.take(2)
println(ints)
6.takeOrdered()
返回该RDD排序后的前n个元素组成的数组
// takeOrdered
// 先对rdd中的数据进行排序 之后再取前n个
// 如果需要倒序排序 需要填写隐式参数
val array: Array[Int] = listRDD.takeOrdered(3)
val array1: Array[Int] = listRDD.takeOrdered(3) (Ordering[Int].reverse)
println(array.toList)
// 先取数据再排序
val sorted: Array[Int] = listRDD.take(3).sorted
println(sorted.toList)
7.aggregate()
将分区内的元素按照分区内的逻辑和初始值进行聚合,然后按照分区间的逻辑和初始值聚合
val listRDD: RDD[Int] = sc.makeRDD(List(1, 2, 3, 4),4)
val i: Int = listRDD.aggregate(10)(_-_,_-_)
println(i)
8.fold()
aggregate操作的简化版,分区内与分区间逻辑相同。
// fold计算逻辑和aggregate相同 都是会使用两次初始值'
// 分区内和分区间的计算逻辑相同
val j: Int = listRDD.fold(10)(_ + _)
val f: Int = listRDD.fold(10)(_ - _)
println(j)
println(f)
9.countByKey()
统计每种key的个数
val value: RDD[(String, Int)] = sc.makeRDD(
List(("a", 10), ("b", 7), ("a", 11), ("b", 21)), 4)
val stringToLong: collection.Map[String, Long] = value.countByKey()
println(stringToLong)
10.save
1.saveAsTextFile(path)保存成Text文件
将数据集的元素以textfile的形式保存到HDFS文件系统或者其他支持的文件系统,对于每个元素,Spark将会调用toString方法,将它装换为文件中的文本。
2.saveAsSequenceFile(path) 保存成Sequencefile文件
将数据集中的元素以Hadoop Sequencefile的格式保存到指定的目录下,可以使HDFS或者其他Hadoop支持的文件系统。注:只有KV类型有该操作。
3.saveAsObjectFile(path) 序列化成对象保存到文件
用于将RDD中的元素序列化成对象,存储到文件中。
// 保存为基础的文本文件 可以直接看懂
value.saveAsTextFile("output")
// saveAsSequenceFile 只能用于二元组的rdd
value.saveAsSequenceFile("output")
value.saveAsObjectFile("output")
11.foreach()
遍历RDD中每一个元素
val intRDD: RDD[Int] = sc.makeRDD(1 to 20, 5)
// 使用collect加打印
val ints: Array[Int] = intRDD.collect()
ints.foreach(println)
// 使用foreach直接打印
// 直接在ex端进行打印 多线程打印 整体无序 分区内有序
intRDD.foreach(println)