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()
}
}