RDD常见转化算子和行动算子

RDD被创建后是只读的,不允许被修改。spark提供了丰富的用于操作RDD的方法,这些方法被称为算子。一个创建完成的RDD只支持两种算子:转化算子和行动算子。转化算子负责对RDD中的数据进行计算并转化为新的RDD。Spark中所有的转化算子都是惰性的,因为他们不会立即计算结果, 而是记住对某个RDD的具体操作过程,直到遇到行动算子才会和行动算子一起执行。

1. 常见转化算子

val sparkConf = new SparkConf().setMaster("local[*]").setAppName("app")
val sc = new SparkContext(sparkConf)

// 1. filter 算子,对源RDD中的每个元素进行过滤,并返回一个行的RDD。
val rdd1 = sc.parallelize(List(1, 2, 3, 4, 5, 6))
rdd1.filter(_ > 3).collect().foreach(println)

// 2. flatMap 与 map 算子类似,但是每个传入的RDD元素会返回0到多个元素,最终将返回的元素合并到一个RDD中。
val rdd2 = sc.parallelize(List("hello spark","hello scala"))
rdd2.flatMap(_.split(" ")).collect().foreach(println)

// 3. reduceByKey() 作用对象是元素为(key, value)形式的RDD,使用该算子可以将相同key的元素聚集到一起,
// 最终把所有相同key的元素合并成一个元素。key不变,value可以聚合成一个列表或者进行求和等操作。
// x,y 代表key相同的两个value
val rdd3 = sc.parallelize(List(("wang1",99),("wang2",98),("wang2",88),("wang1",100)))
//val rdd33 = rdd3.reduceByKey((x, y) => x + y)
rdd3.reduceByKey(_+_).collect().foreach(println)

// 4. groupByKey 作用对象是元素为(key, value)形式的RDD,使用该算子可以将相同key的元素聚集到一起,
// 最终把所有相同的key的元素合并成一个元素,key不变,value则聚集到一个集合。
// 所以groupByKey就相当于reduceByKey的一部分
val rdd4 = sc.parallelize(List(("wang1",99),("wang2",98),("wang2",88),("wang1",100)))
val rdd44 = rdd4.groupByKey()
rdd44.map(x => (x._1,x._2.sum)).collect().foreach(println)

// 5. union() 将两个RDD合并成一个新的RDD,主要用于对不同数据来源进行合并,两个RDD中的数据类型要保持一致。
val rdd51 = sc.parallelize(Array(1,2,3))
val rdd52 = sc.parallelize(Array(4,5,6))
val rdd55 = rdd51.union(rdd52)
rdd55.collect().foreach(println)

// 6. sortBy() 将RDD中的元素按照某个规则进行排序。第一个参数为排序函数,第二个参数是布尔值,默认升序。false为降序。
val rdd6 = sc.parallelize(Array(("hadoop",1),("spark",2),("scala",3)))
rdd6.sortBy(_._2,false).collect().foreach(println)

// join() 类似数据库的内连接,只返回两个RDD匹配的内容。
// leftOuterJoin() 类似数据库的左连接,只返回两个RDD匹配的内容。
// rightOuterJoin() 类似数据库的右连接,只返回两个RDD匹配的内容。
// fullOuterJoin() 类似数据库的全连接,返回两个RDD的所有内容。
// Some 和 None 都属于Option类型,该类型表示一个值是可选的(有值或者无值)

val rdd71 = sc.parallelize(Array(("A","a1"),("B","b1"),("C","c1"),("D","d1"),("E","e1")))
val rdd72 = sc.parallelize(Array(("A","A1"),("B","B1"),("C","C1"),("C","C2"),("C","C3"),("E","E1")))

rdd71.join(rdd72).collect().foreach(println)
rdd71.leftOuterJoin(rdd72).collect().foreach(println)
rdd71.rightOuterJoin(rdd72).collect().foreach(println)
rdd71.fullOuterJoin(rdd72).collect().foreach(println)

sc.stop()

2. 常见行动算子

val sparkConf = new SparkConf().setMaster("local[*]").setAppName("app")
val sc = new SparkContext(sparkConf)
// 1. reduce() 将RDD中的元素进行聚合计算
val rdd1 = sc.parallelize(1 to 10)
val i: Int = rdd1.reduce(_ + _)
println(i)

// 2. count() 将RDD中的元素进行聚合计算
val rdd2 = sc.parallelize(1 to 10)
val c: Long = rdd2.count
println(c)

// 3.take() 将RDD中的元素进行聚合计算
val rdd3 = sc.parallelize(1 to 10)
val arr: Array[Int] = rdd3.take(5)
println(arr)
sc.stop()
// 4.collect() 以数组形式返回数据集中所有元素
// 5.saveAsTextFile(path) 将数据集中的元素持久化到文件

你可能感兴趣的:(spark学习)