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
- sc.parallelize(arr)
- 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 笛卡爾積
- 類似關係型數據庫的的笛卡爾積