Action行动算子---返回数据集算子、遍历算子讲解(下)

139 阅读3分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 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中元素的个数

理解图如下所示:

image.png

3)first(): 返回RDD中的第一个元素

def first(): T

功能:返回RDD中的第一个元素

图示如下:

image.png

4)take(): 返回数组-->由RDD中前n个元素组成的数组

def take(num: Int): Array[T]

功能:返回一个由RDD的前n个元素组成的数组

图示如下:

image.png

5)takeOrdered(): 返回数组-->该RDD排序后前n个元素组成的数组

def takeOrdered(num: Int)(implicit ord: Ordering[T]): Array[T]

功能:返回该RDD排序后的前n个元素组成的数组

理解图示如下:

image.png

综上,相关算子的实例代码如下:

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)

    // 1collect() 返回数据时,会按照分区的编号和顺序来收集数据,最终的结果全局有序
    val array: Array[Int] = intRDD.collect()
    array.foreach(println)

    // 2count() 返回rdd中元素的个数
    val countResult: Long = intRDD.count()
    println(countResult)

    // 3first()  返回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打印,此时的打印出的数据是全局有序的

如下图所示:

image.png

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类型(二)--聚合算子(上)

(3)Transformation算子: Key-Value类型(二)--分区、排序算子(下)

(4)Action行动算子---聚合、统计key数、save算子(上)