[ Spark ] RDD行动算子汇总

RDD行动算子

行动算子:触发作业执行的方法,底层调用的是环境对象的runJob方法,底层代码中会创建ActiveJob,并提交执行

1)def reduce(f: (T, T) => T): T

​ 先聚合分区内数据,再聚合分区间数据,这里聚合的结果的类型和数据源中的类型一致

2)def collect(): Array[T]

​ 将不同分区的数据按照分区顺序采集到Driver端内存中,形成数组

3)def count(): Long

​ 返回RDD中元素的个数

4)def first(): T

​ 返回RDD中的第一个元素

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

​ 返回一个由RDD的前n个元素组成的数组

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

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

val rdd = sc.makeRDD(List(1, 2, 3, 4))


    /*val i = rdd.reduce(_ + _)
    println(i)*/

    //collect:将不同分区的数据按照分区顺序采集到driver端内存中的数组
    /*val ints: Array[Int] = rdd.collect()
    println(ints.mkString(","))*/

    /*val l: Long = rdd.count()
    println(l)*/

//    println(rdd.first())

//    rdd.take(3).foreach(println)

    val rdd1 = sc.makeRDD(List(3, 4, 2, 1))
    rdd1.takeOrdered(3).foreach(println)

7)def aggregate[U: ClassTag] (zeroValue: U)(seqOp: (U, T) => U, combOp: (U, U) => U): U

​ 分区的数据通过初始值和分区内的数据进行聚合,然后再和初始值进行分区间的数据聚合

val rdd = sc.makeRDD(List(1, 2, 3, 4),2)

    //初始值不仅参与分区内还参与分区间计算
//    val i = rdd.aggregate(10)(_ + _, _ + _)//40

    //同理fold
    val i=rdd.fold(10)(_+_)

8)def countByKey(): Map[K, Long]

​ 统计每种key的个数,结果为Map集合

val rdd = sc.makeRDD(List(1, 2, 3, 4),2)
    val rdd1 = sc.makeRDD(List(("a",1), ("a",2), ("a",3)),2)

    //统计单值类型rdd的wordcount
//    println(rdd.countByValue())

    //统计kv类型rdd的wordcount
    println(rdd1.countByKey())

9)def saveAsTextFile(path: String): Unit

​ def saveAsObjectFile(path: String): Unit

​ def saveAsSequenceFile(

​ path: String,

​ codec: Option[Class[_ <: CompressionCodec]] = None): Unit

​ 将数据保存到不同格式的文件中(第三种要求数据格式必须为kv类型)

val rdd = sc.makeRDD(List(1, 2, 3, 4),2)
val rdd1 = sc.makeRDD(List(("a",1), ("a",2), ("a",3)),2)

rdd.saveAsTextFile("output")
rdd.saveAsObjectFile("output1")
//要求数据格式必须kv类型
rdd1.saveAsSequenceFile("output2")

10)def foreach(f: T => Unit): Unit = withScope {

​ val cleanF = sc.clean(f)

​ sc.runJob(this, (iter: Iterator[T]) => iter.foreach(cleanF))

​ }

分布式遍历RDD中的每一个元素,不同于collect的按分区间的顺序采集,这是在executor端做操作(打印等),而collect后的foreach打印是Driver端内存集合的循环遍历方法

val rdd = sc.makeRDD(List(1, 2, 3, 4))

rdd.collect().foreach(println)

println("-----------------")
rdd.foreach(println)

11)怎么理解算子和scala中集合的方法的区别?

RDD的方法和Scala集合对象的方法不一样

集合对象的方法都是在同一个节点的内存中完成的.

RDD的方法可以将计算逻辑发送到Executor端(分布式节点)执行

为了区分不同的处理效果,所以将RDD的方法称之为算子,

RDD方法外部的操作都是在Driver端执行的,而方法内部的逻辑代码是在Executor端执行

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值