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端执行