RDD基本操作

定義

RDD是彈性分佈式數據集(Resilient Distributed Dataset), RDD 其實就是分佈式的元素集合。就像List,Array,Set,Map集合。在 Spark 中,對數據的所有操作不外乎創建 RDD、 轉化已有 RDD 以及調用 RDD 操作進行求值。而在這一切背後, Spark 會自動將RDD中的數據分發到集羣上,並將操作並行化執行。

用戶可以使用兩種方法創建 RDD: 讀取一個外部數據集,或在驅動器程序裏分發驅動器程序中的對象集合(比如 list 和 set) ;

RDD是隻讀的。一旦生成就不能修改;

RDD可以通過重新計算得到;

舉個栗子,讀取文件ReadME.md數據

》lines = sc.textFile("README.md") 

》pythonLines = lines.filter(lambda line: "Python" in line) 

Spark 只會惰性計算這些 RDD ,也就是它們只有第一次在一個行動操作中用到時,纔會真正計算 。這樣的好處是上面例子我們以一個文本文件定義了數據,然後把其中包含 Python 的行篩選出來。如果 Spark 在我們運行 lines= sc.textFile(…) 時就把文件中所有的行都讀取並存儲起來, 就會消耗很多存儲空間,而我們馬上就要篩選掉其中的很多數據。相反, 一旦 Spark 瞭解了完整的轉化操作鏈之後,它就可以只計算求結果時真正需要的數據。事實上,在行動操作 first() 中, Spark 只需要掃描文件直到找到第一個匹配的行爲止,而不需要讀取整個文件 。默認情況下, Spark 的 RDD 會在你每次對它們進行行動操作時重新計算。如果想在多個行動操作中重用同一個 RDD, 可以使用 RDD.persist() 讓 Spark 把這個 RDD 緩存下來

轉換(Transformation)操作

每次轉換操作都會生成一個新的RDD。轉化出來的 RDD 是惰性求值的,只有在行動操作中用到這些 RDD 時纔會被計算 。

轉換 說明
map 數據集中的每條元素經過函數轉換後形成一個新的分佈式數據集
filter 過濾作用,選取數據集中讓函數返回爲true的元素,形成一個新的數據集
flatMap 類似於map,但每個輸入項可以被映射到0個或更多的輸出項
mapParttions 類似於map,但單獨運行在RDD每個分區
union 返回一個由原數據集和參數聯合而成的心得數據集
distinct 返回一個數據集去重過後的新的數據集

說明

​ map:

​ 第一次看map的操作,半天沒有看懂,原因是在java中map是一個k,v鍵值對集合。就搞不懂這個是怎麼 回事看了很久才明白這個跟java中的map不是一回事。map輸入是一個RDD,輸出也是一個RDD,RDD數不會變。

​ flatMap:

​ 是一個RDD轉換函數,接受一個函數作爲輸入,對當前RDD所有成員電泳輸入的函數,並返回一個新的RDD,flatMap對每個輸入的RDD,返回的是一個集合,集合裏面的成員會被展開,一個輸入可以對應多個輸出。比如對“# Apache Spark”進行空格拆分,返回的是一個數組,包含3個成員,“#”,“Apache”,“Spark”,最終3個成員會成爲RDD直接成員。

行動(Action)操作

對數據轉換後進行行動操作,輸出結果不再是RDD,返回給Driver程序

操作 說明
reduce 對RDD成員使用進行reduce操作,返回結果只有一個值
collect 將RDD讀取到Driver程序,類型是一個Array,一般要求RDD不能太大
count 返回RDD成員數
first 返回RDD一個成員
take(n) 返回前n個成員
saveAsTextFile(path) 將RDD轉換爲文本內容並保存到path路徑下,可能有多個文件,path可以爲具體路徑或HDFS地址
saveAsSequenceFile(path) 與saveAsTextFile類似,但是已SequenceFile格式保存
countBykey 僅適用於(k,v)類型,對key計算,返回(k,int)
foreeach(func) 對RDD中的每個成員執行回調func,沒有返回值,常用於更新計算器或輸出數據至外部存儲系統。這裏需要注意變量的作用域

說明:

collect:

可以用來獲取整個 RDD 中的數據。如果你的程序把 RDD 篩選到一個很小的規模,並且你想在本地處理
這些數據時, 就可以使用它。只有當你的整個數據集能在單臺機器的內存中放得下時,才能使用 collect(),因此, collect() 不能用在大規模數據集上 。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章