Spark RDD是什麼?
RDD(resilient Distributed Dataset)彈性分佈式數據集,是spark中基本的計算(數據)抽象。它代表一個不可變,可分區,裏面的元素可以並行(多個線程一起執行)計算的集合
裝飾者模式是什麼?
裝飾者模式是設計模式其中的一種,是指在不改變原有對象的基礎之上,將功能附加到對象上。提供了比繼承更有彈性的替代方案(擴展原有對象功能)。簡單來說,就是給對象添加一個功能,但並沒有改變原有對象
RDD如何體現裝飾者模式?
1.先用一段簡單wordcount代碼來引出RDD是如何體現裝飾者模式
//需要統計列表中每個單詞出現的個數
//創建一個列表
val list = List("hnswxy is very good","hello scala","hello java")
//創建SparkConf對象
val conf:SparkConf = new SparkConf().setMaster("local[*]").setAppName("wordCount01")
//創建Spark上下文對象,並將conf傳入
val sc = new SparkContext(conf)
//從集合中創建RDD,並將集合傳入
val rdd:RDD[String] = sc.makeRDD(list)
//將rdd對象進行扁平化操作,取出list中的每個元素
val rdd1:RDD[String] = rdd.flatMap(_.split(" "))
//將rdd1對象進行map操作,將字符串中每個單詞轉換爲k-v形式,v爲 1
val rdd2:RDD[(String,Int)] = rdd1.map(_ -> 1)
//將rdd2對象進行reduceByKey操作,將相同key值的value聚合
val rdd3:RDD[(String,Int)] = rdd2.reduceByKey(_+_)
//將最終結果打印
rdd3.collect().foreach(println)
運行結果
(scala,1)
(hnswxy,1)
(is,1)
(very,1)
(hello,2)
(java,1)
(good,1)
3.算子
①算子(operate):從認知心理學的角度看,解決問題其實是將問題的初始狀態,通過一系列操作(算子)問題的狀態進行轉換,然後達到完成(解決)狀態
②spark中所有的RDD方法都可以稱之爲算子,算子分爲兩大類:轉換算子 行動算子
③由一個RDD轉換到另一個RDD,可以通過豐富的算子實現,不再像MapReduce那樣只能寫map和redeuce了
3.可以從上述代碼中看出:
先利用列表創建了一個RDD對象,然後不斷的利用算子將RDD轉換成另一個RDD,也就是將RDD裝飾成另外一個RDD,原有的RDD並沒有改變,這種RDD的轉換就體現了裝飾者模式。