第1章 RDD概述
1.1 什麼是RDD
RDD(Resilient Distributed Dataset)叫做分佈式數據集,是Spark中最基本的數據抽象。代碼中是一個抽象類,它代表一個不可變、可分區、裏面的元素可並行計算的集合。
1.2 RDD的屬性
1)一組分區(Partition),即數據集的基本組成單位;
2)一個計算每個分區的函數;
3)RDD之間的依賴關係;
4)一個Partitioner,即RDD的分片函數;
5)一個列表,存儲存取每個Partition的優先位置(preferred location)。
1.3 RDD特點
RDD表示只讀的分區的數據集,對RDD進行改動,只能通過RDD的轉換操作,由一個RDD得到一個新的RDD,新的RDD包含了從其他RDD衍生所必需的信息。RDDs之間存在依賴,RDD的執行是按照血緣關係延時計算的。如果血緣關係較長,可以通過持久化RDD來切斷血緣關係。
三種讀取方式
object Spark01_RDD extends App {
// 設定Spark計算環境
val config: SparkConf = new SparkConf().setMaster("local[*]").setAppName("WordCount")
// 創建上下文
val sc = new SparkContext(config)
// 創建RDD
// 1) 從內存中創建 markRDD,底層實現就是parallelize
val listRDD = sc.makeRDD(List(1, 2, 3, 4))
// 2) 從內存中創建 parallelize
val arrayRDD = sc.parallelize(Array(1, 2, 3, 4))
listRDD.collect().foreach(println)
// 3) 從外部存儲中創建
// 默認情況下,可以讀取項目路徑,也可以讀取其它路徑:HDFS
// 默認從文件中讀取的數據都是字符串類型
private val fileRDD: RDD[String] = sc.textFile("in")
listRDD.saveAsTextFile("output")
}
makeRDD與parallelize 本質是相同的
/** Distribute a local Scala collection to form an RDD.
*
* This method is identical to `parallelize`.
* @param seq Scala collection to distribute
* @param numSlices number of partitions to divide the collection into
* @return RDD representing distributed collection
*/
def makeRDD[T: ClassTag](
seq: Seq[T],
numSlices: Int = defaultParallelism): RDD[T] = withScope {
parallelize(seq, numSlices)
}