目录

  • ​​spark outline​​
  • ​​spark Action 行动算子简介​​
  • ​​代码演示​​

spark outline

​​大纲目录​​

spark Action 行动算子简介

行动算子是触发了整个作业的执行。因为转换算子都是懒加载,并不会立即执行

  • reduce算子
    功能:聚合(先聚合分区内数据,再聚合分区间数据)
  • collect算子
    功能:以数组的形式返回数据集
  • count算子
    功能:返回RDD中元素个数
  • first算子
    功能:返回RDD中的第一个元素
  • take算子
    功能:返回由RDD中前n个元素组成的数组
  • takeOrdered算子
    功能:返回该RDD排序后的前n个元素组成的数组
  • aggregate算子
    功能: 将每个分区里面的元素通过分区内逻辑和初始值进行聚合,然后用分区间逻辑和初始值(zeroValue)进行操作。​​​但​​分区间逻辑再次使用初始值和aggregateByKey是有区别的

spark Action 行动算子_数组

  • fold算子
    功能:折叠操作,即aggregate的简化操作(分区内逻辑和分区间逻辑相同)
  • countByKey算子
    功能:统计每种key的个数
  • foreach算子
    功能:遍历RDD中的每一个元素
  • save相关算子
  1. saveAsTextFile(path)保存成Text文件
  2. saveAsSequenceFile(path) 保存成Sequencefile文件
  3. saveAsObjectFile(path) 序列化成对象保存到文件

代码演示

package com.xcu.bigdata.spark.core.pg02_rdd.pg023_rdd_action

import org.apache.spark.rdd.RDD
import org.apache.spark.{SparkConf, SparkContext}


object Spark01_Action {
def main(args: Array[String]): Unit = {
//创建配置文件
val conf: SparkConf = new SparkConf().setAppName("Spark01_Action").setMaster("local[*]")
//创建SparkContext,该对象是提交的入口
val sc = new SparkContext(conf)
//创建RDD
val rdd: RDD[Int] = sc.makeRDD(List(1, 5, 3, 2, 4, 6), numSlices = 3)
// reduce 与reduceByKey的区别是:reduceByKey是kv类型 reduce是单值类型
val res1: Int = rdd.reduce((x: Int, y: Int) => (x + y))
println(res1)
println("**********************************")
//count 获取RDD中元素的个数
val res2: Long = rdd.count()
println(res2)
println("**********************************")
//first() 返回RDD中的第一个元素
val res3: Int = rdd.first()
println(res3)
println("**********************************")
//take 返回rdd前n个元素组成的数组
val res4: Array[Int] = rdd.take(3)
println(res4.mkString(","))
println("**********************************")
//takeOrdered 获取RDD排序后前n的元素组成的数组
val res5: Array[Int] = rdd.takeOrdered(3)
println(res5.mkString(","))
println("**********************************")
// aggregate
/*
将每个分区里面的元素通过分区内逻辑和初始值进行聚合,然后用分区间逻辑和初始值(zeroValue)进行操作。
注意:分区间逻辑再次使用初始值和aggregateByKey是有区别的。
*/
val res6: Int = rdd.aggregate(10)(_ + _, _ + _)
println(res6)
println("**********************************")
//countByKey 统计每种key出现的次数
val rdd1: RDD[(Int, String)] = sc.parallelize(List((1, "a"), (1, "a"), (1, "a"), (2, "b"), (3, "c"), (3, "c")))
val res7: collection.Map[Int, Long] = rdd1.countByKey()
println(res7)
//释放资源
sc.stop()
}
}

输出结果

21
**********************************
6
**********************************
1
**********************************
1,5,3
**********************************
1,2,3
**********************************
61
**********************************
Map(1 -> 3, 2 -> 1, 3 -> 2)

Process finished with exit code 0