Spark RDD算子【大數據 Spark】

1. RDD是什麼

RDD(Resilient Distributed DataSet), 在我們開發spark程序的時候我們可以把RDD當做一個完整的數據集來操作, 但是實際情況是我們的數據可能分佈在不同的Executor進程中進行計算;所以RDD它相當於一個數據集的抽象,類似於一個代理,對代理操作他會具體的分發計算到具體的某一個計算機

Internally, each RDD is characterized by five main properties:

  • A list of partitions
  • A function for computing each split
  • A list of dependencies on other RDDs
  • Optionally, a Partitioner for key-value RDDs (e.g. to say that the RDD is hash-partitioned)
  • Optionally, a list of preferred locations to compute each split on (e.g. block locations for
    an HDFS file)

2. 創建RDD

2.1 Scala集合轉RDD

  1. sc.parallelize(arr)
  2. sc.makeRDD(arr)

注意: 這種RDD必須在Driver程序中生成

  • 代碼實現
object GeneratedRDDByScalaSet {

  def main(args: Array[String]): Unit = {
    val arr = Array(1,2,3,4,5,6,7,8,9)

    // spark context
    val conf = new SparkConf()
            .setAppName("generate RDD by scala set")
            .setMaster("local")
    val sc = new SparkContext(conf)

    val res = sc.parallelize(arr).map(_ * 10).collect()
    print(res(0))
  }

}

3.RDD的算子

3.1 map & flatMap & mapValues & flatMapValues

  • map
    將一個元素映射爲另外一中形式, 就相當於集合中的每個元素x都進行了一次f(x)的計算

  • flatMap
    將一個元素x經過f(x)得到一個集合,並把所有元素的得到的集合進行合併產生一個新的集合

3.2 union & intersection

  • union
    求兩個RDD的並集

  • intersection
    交集

3.3 join & leftOutterJoin & rightOuterJoin

  • 根據key進行連接
object OperationJoin {
  def main(args: Array[String]): Unit = {
    val l1 = List(("tom", 1), ("kk", 1), ("jam", 1))
    val l2 = List(("tom", 2), ("kk", 3), ("jam", 4), ("xx", 4))

    // spark context
    val conf = new SparkConf()
      .setAppName("generate RDD by scala set")
      .setMaster("local")
    val sc = new SparkContext(conf)

    val rdd1: RDD[(String, Int)] = sc.parallelize(l1)
    val rdd2: RDD[(String, Int)] = sc.parallelize(l2)

    val res: RDD[(String, (Int, Int))] = rdd1 join rdd2
    val tuples: Array[(String, (Int, Int))] = res.collect()
  }

}

3.4 groupByKey

  • 假如有一組元組(key, v), 進行groupBy之後得到(key,compactBuffer(v1, v2, …))

3.5 cogroupBy

  • 作用:
    它首先是將同一個rdd裏面的有相同的key的值放在一個ArrayBuffer裏面。最後再更具key做了一次groupByKey。
val a = sc.parallelize(List(1, 2, 1, 3), 1)
val b = a.map((_, "b")) //這個將原來的數據變爲一個鍵值對類型。
val c = a.map((_, "c"))

b.cogroup(c).collect
res7: Array[(Int, (Iterable[String], Iterable[String]))] = Array(
(2,(ArrayBuffer(b),ArrayBuffer(c))),
(3,(ArrayBuffer(b),ArrayBuffer(c))),
(1,(ArrayBuffer(b, b),ArrayBuffer(c, c)))

3.6 cartesian 笛卡爾積

  • 類似關係型數據庫的的笛卡爾積
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章