这是我参与更文挑战的第4天,活动详情查看:更文挑战
介绍
-
RDD算子从对数据操作来讲大致分为两类: 转换(transformations)和行动(action)
- 转换算子: 将一个RDD转换为另一个RDD,仅仅只是功能叠加,并不会真正去执行。(装饰者设计模式)
- 行动算子: 行动算子会真正触发 SparkContext 提交 Job 作业。
本文讲述其中的 行动算子
1. reduce
聚集RDD中的所有元素,先聚合分区内数据,再聚合分区间数据
//使用例子
val sc: SparkContext = new SparkContext(
new SparkConf()
.setMaster("local")
.setAppName("RddMem")
)
val rdd: RDD[Int] = sc.makeRDD(
List(1, 2, 4, 5, 6)
)
//聚合
val sum = rdd.reduce(_ + _)
println(sum)
sc.stop()
2. collect
在驱动程序(Driver)中,以数组Array的形式返回数据集的所有元素
//使用例子
val sc: SparkContext = new SparkContext(
new SparkConf()
.setMaster("local")
.setAppName("RddMem")
)
val rdd: RDD[Int] = sc.makeRDD(
List(1, 2, 4, 5, 6), 3
)
val list = rdd.collect()
println(list.mkString(","))
sc.stop()
3. count
取RDD中元素的个数
//使用例子
val sc: SparkContext = new SparkContext(
new SparkConf()
.setMaster("local")
.setAppName("RddMem")
)
val rdd: RDD[Int] = sc.makeRDD(
List(1, 2, 4, 5, 6), 3
)
val count = rdd.count()
println(count)
sc.stop()
4. first
取RDD中的第一个元素
//使用例子
val sc: SparkContext = new SparkContext(
new SparkConf()
.setMaster("local")
.setAppName("RddMem")
)
val rdd: RDD[Int] = sc.makeRDD(
List(1, 2, 4, 5, 6), 3
)
//取第一个
val firstNum = rdd.first()
println(firstNum)
sc.stop()
5. take
取一个由RDD的前n个元素组成的数组
//使用例子
val sc: SparkContext = new SparkContext(
new SparkConf()
.setMaster("local")
.setAppName("RddMem")
)
val rdd: RDD[Int] = sc.makeRDD(
List(1, 2, 4, 5, 6), 3
)
//取前三个
val numList = rdd.take(3)
println(numList.mkString(","))
sc.stop()
6. takeOrdered
取RDD排序后的前n个元素组成的数组
//使用例子
val sc: SparkContext = new SparkContext(
new SparkConf()
.setMaster("local")
.setAppName("RddMem")
)
val rdd: RDD[Int] = sc.makeRDD(
List(1, 7, 4, 5, 6), 3
)
//升序
//val numList = rdd.takeOrdered(3)
//降序
val numList = rdd.takeOrdered(3)(Ordering.Int.reverse)
println(numList.mkString(","))
sc.stop()
7. aggregate
分区的数据通过初始值和分区内的数据进行聚合,然后再和初始值进行分区间的数据聚合
//使用例子
val sc: SparkContext = new SparkContext(
new SparkConf()
.setMaster("local")
.setAppName("RddMem")
)
val rdd: RDD[Int] = sc.makeRDD(
List(1, 7, 4, 5), 2
)
// 0+1 + 7 =8
// 0+4 + 5 =9
// 0+9 + 10=90
val res: Int = rdd.aggregate(0)(
(i: Int, j: Int) => {
i + j
}
, (i: Int, j: Int) => {
i + j
}
)
println(res)
// 1+1 + 7 =9
// 1+4 + 5 =10
// 1*9 * 10=90
val res2: Int = rdd.aggregate(1)(_ + _, _ * _)
println(res2)
sc.stop()
8. fold
聚集RDD中的所有元素,先聚合分区内数据,再聚合分区间数据,分区内和合分区计算规则一样
相当于aggregate简化写法
//使用例子
val sc: SparkContext = new SparkContext(
new SparkConf()
.setMaster("local")
.setAppName("RddMem")
)
val rdd: RDD[Int] = sc.makeRDD(
List(1, 7, 4, 5), 2
)
//与rdd.aggregate(0)(_ + _, _ + _)
val res: Int = rdd.fold(0)(_ + _)
println(res)
sc.stop()
9. countByKey
统计每种key的个数
//使用例子
val sc: SparkContext = new SparkContext(
new SparkConf()
.setMaster("local")
.setAppName("RddMem")
)
val rdd: RDD[(String,Int)] = sc.makeRDD(
List(("a", 1), ("b", 2), ("a", 1), ("b", 2)), 2
)
val res = rdd.countByKey()
println(res)
sc.stop()
10. saveXxxxx
将数据保存到不同格式的文件中
//使用例子
val sc = new SparkContext(
new SparkConf().setMaster("local[*]").setAppName("MapPartitions")
)
val rdd = sc.makeRDD(List(
("a", 1), ("a", 2), ("b", 3), ("b", 3), ("b", 3)
), 1)
/**
* text文件
*/
rdd.saveAsTextFile("text")
/**
* Sequence文件
*/
rdd.saveAsSequenceFile("sequence")
/**
* object文件
*/
rdd.saveAsObjectFile("object")
sc.stop()
11. foreach
分布式遍历RDD中的每一个元素,调用指定函数
//使用例子
val sc = new SparkContext(
new SparkConf().setMaster("local[*]").setAppName("MapPartitions")
)
val rdd = sc.makeRDD(List(
("a", 1), ("a", 2), ("b", 3), ("b", 3), ("b", 3)
), 1)
//分布式遍历
rdd.foreach(println(_))
sc.stop()