持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第21天,点击查看活动详情
上一篇文章我们讲到聚合、统计以及save相关算子,但这三个算子其实用的比较多的也就是save算子,对于聚合一般通常都会用转换算子中的 reduceByKey、aggregateByKey,这篇文章我们讲一下行动算子中用的比较多的 返回数据相关的算子(collect())以及遍历算子(foreach())。
返回数据的相关算子
1)collect( ): 以数组的形式返回数据集
def collect(): Array[T]
功能:在驱动程序中,以数组Array的形式返回数据集的所有元素。
注意: collect() 会将executor端的数据收到driver端。返回数据时,会按照分区的编号,按顺序进行收集数据,最终的结果是全局有序的
2)count(): 返回RDD中的元素个数
def count(): Long
功能: 返回RDD中元素的个数
理解图如下所示:
3)first(): 返回RDD中的第一个元素
def first(): T
功能:返回RDD中的第一个元素
图示如下:
4)take(): 返回数组-->由RDD中前n个元素组成的数组
def take(num: Int): Array[T]
功能:返回一个由RDD的前n个元素组成的数组
图示如下:
5)takeOrdered(): 返回数组-->该RDD排序后前n个元素组成的数组
def takeOrdered(num: Int)(implicit ord: Ordering[T]): Array[T]
功能:返回该RDD排序后的前n个元素组成的数组
理解图示如下:
综上,相关算子的实例代码如下:
object action_Collect {
def main(args: Array[String]): Unit = {
// 1. 创建配置对象
val conf: SparkConf = new SparkConf().setAppName("sparkCore").setMaster("local[*]")
// 2. 初始化sc
val sc = new SparkContext(conf)
// 3. 编写代码
val intRDD: RDD[Int] = sc.makeRDD(1 to 100,16)
// 1)collect() 返回数据时,会按照分区的编号和顺序来收集数据,最终的结果全局有序
val array: Array[Int] = intRDD.collect()
array.foreach(println)
// 2)count() 返回rdd中元素的个数
val countResult: Long = intRDD.count()
println(countResult)
// 3)first() 返回RDD中第一个元素
val firstResult: Int = intRDD.first()
println(firstResult)
// 4) take() 返回RDD中的前n个元素组成数组 这里取前两个元素
val takeResult: Int = intRDD.take(2)
println(takeResult.mkString(","))
// 5) takeOrdered() 返回RDD排序的前n个元素组成数组 这里取前三个元素
val result: Int = intRDD.takeOrdered(3)
println(result.mkString(","))
// 4.关闭sc
sc.stop()
}
}
遍历算子
foreach(f):遍历RDD中每一个元素
def foreach(f:T => Unit):Unit
功能: 遍历RDD中的每一个元素,并依次应用 f函数
注意:调用foreach算子时,如果是直接调用遍历RDD,会直接在executor端执行打印,所以打印的数据是无序的(此时的无序指的是RDD中的原数据顺序)。这种方式使用最多,因为可以直接在executor多线程处理数据,效率最高。另一种方式如果先调用collect算子有序的返回数据,此时会在Driver端执行foreach打印,此时的打印出的数据是全局有序的
如下图所示:
object action11_foreach {
def main(args: Array[String]): Unit = {
//1.创建SparkConf并设置App名称
val conf: SparkConf = new SparkConf().setAppName("SparkCoreTest").setMaster("local[*]")
//2.创建SparkContext,该对象是提交Spark App的入口
val sc: SparkContext = new SparkContext(conf)
//3具体业务逻辑
//3.1 创建第一个RDD
val rdd: RDD[Int] = sc.makeRDD(List(1,2,3,4))
//3.2 收集后打印 ---> 全局有序
rdd.collect().foreach(println)
println("--------------------")
//3.3 分布式打印 ---> 无序输出,效率高
rdd.foreach(println)
//4.关闭连接
sc.stop()
}
}
总结
至此,关于RDD的Transformation转换算子、action行动算子全部更新完毕,读者可以根据图示和代码进行对算子的功能进行理解记忆。
往期算子文章:
(1)Transformation算子: 单Value类型(一)
(2)Transformation算子: Key-Value类型(二)--聚合算子(上)