天天看點

4. RDD

RDD:彈性分布式資料集

五大特性:

1.A list of partitions (分區)

RDD是一個由多個partition(分區)組成的的list;将資料加載為RDD時,一般會遵循資料的本地性(一般一個hdfs裡的block會加載為一個partition)。

2.A function for computing each split (函數作用于每個分區)

RDD的每個partition上面都會有function,也就是函數應用,其作用是實作RDD之間partition的轉換。

比如說rdd1.map(_*10),把RDD裡面的每一個元素取出來乘以10,每個分區都應用這個map的函數。

3.A list of dependencies on other RDDs (記錄依賴以便恢複)

RDD會記錄它的依賴 ,為了容錯(重算,cache,checkpoint),也就是說在記憶體中的RDD操作時出錯或丢失會進行重算。

例如,rdd1.map(_*10).flatMap(..).map(..).reduceByKey(...)

可以看到有很多個階段,這些階段叫做stage,RDDstage之間會有依賴關系,後面根據前面的依賴關系來建構,如果前面的資料丢了,它會記住前面的依賴,從前面進行重新恢複。每一個算子都會産生新的RDD.textFile 與flatMap會産生兩個RDD.

4.Optionally,a Partitioner for Key-value RDDs (針對key-value的分區器)

可選,決定資料到哪個分區裡面,這個RDD是key-value 的時候才能有

5.Optionally, a list of preferred locations to compute each split on (采用最優位置進行運算)

選擇最優的位置去計算,也就是資料的本地性。資料在哪台機器上,任務就啟在哪個機器上,資料在本地上,不用走網絡。不過資料進行最後彙總的時候就要走網絡。(hdfs file的block塊)

常見的運算,不全

轉換:

1. map、flatMap、mapValues

都跟着需要執行的函數

map:執行map裡的函數,應用到每個RDD元素上,轉換成新的RDD,但可能是分層的

flatMap:基本與map相同,但傳回的是扁平化的資料(不分層),詳見wordcount執行個體

mapValues:針對key-value型RDD,key不計算,對value進行計算

2. 拼接:union、join、leftOuterJoin、rightOuterJoin

union:拼接

join:針對key-value型RDD,對相同的key進行拼接,不相同的都不要

leftOuterJoin:針對左邊RDD的key來拼接,如果左邊有右邊沒有就補全None

rightOuterJoin:針對右邊RDD的key來拼接

intersection():與拼接這種類似求并集的操作對應,intersection是找出相同元素(交集)

3. 一些真對字典RDD的ByKey操作

sortByKey排序、subtractByKey去重

4. 其他

parallelize轉換、filter過濾、distinct去重、randomSplit分割

動作:

reduce:執行reduce裡的函數來整合所有RDD資料

reduceByKey:類似reduce,針對key-value型RDD

collect():以數組的形式傳回資料集的所有元素

first():檢視首行資料

take(5):檢視前5行資料

count():計數

countByKey():類似count,針對key-value型RDD

status:統計,包括count、mean、stdev(标準差)、max、min

collectAsMap:轉化成字典

lookup:根據key檢視value

saveAsTextFile(路徑):儲存為檔案,可分為本地檔案和hdfs檔案

持久化:

intRDD = sc.parallelize([3,2,2,1,5]) # 建立RDD

intRDD.persist() # 持久化

intRDD.is_cached # 檢視是否儲存到緩存(cached)

intRDD.unpersist() # 取消持久化

intRDD.persist(StorageLevel.MEMORY_AND_DISK) # 設定持久化的存儲等級

存儲等級分為:

MEMORY_ONLY 僅記憶體,預設選項

MEMORY_AND_DISK 記憶體和硬碟

DISK_ONLY 硬碟

MEMORY_ONLY,2 備份,數字表示複制到幾個節點

(MEMORY_ONLY_SER) 類似MEMORY_ONLY,更多的使用cpu資源,更少的占用記憶體

(MEMORY_AND_DISK_SER) 類似上述

繼續閱讀