2019-03-09

一、概述

RDD創(chuàng)建后就可以在RDD上進行數據處理。RDD支持兩種操作:轉換(transformation),即從現有的數據集創(chuàng)建一個新的數據集;動作(action),即在數據集上進行計算后,返回一個值給Driver程序。

RDD 的轉化操作是返回一個新的 RDD 的操作,比如 map() 和 filter() ,而行動操作則是向驅動器程序返回結果或把結果寫入外部系統(tǒng)的操作,會觸發(fā)實際的計算,比如 count() 和 first() 。Spark 對待轉化操作和行動操作的方式很不一樣,因此理解你正在進行的操作的類型是很重要的。如果對于一個特定的函數是屬于轉化操作還是行動操作感到困惑,你可以看看它的返回值類型:轉化操作返回的是 RDD,而行動操作返回的是其他的數據類型。

RDD中所有的Transformation都是惰性的,也就是說,它們并不會直接計算結果。相反的它們只是記住了這些應用到基礎數據集(例如一個文件)上的轉換動作。只有當發(fā)生一個要求返回結果給Driver的Action時,這些Transformation才會真正運行。

這個設計讓Spark更加有效的運行。

二、RDD支持的常用Transformation如下:

map(func)

返回一個新的分布式數據集,該數據集由每一個輸入元素經過func函數轉換后組成

fitler(func)

返回一個新的數據集,該數據集由經過func函數計算后返回值為true的輸入元素組成

flatMap(func)

類似于map,但是每一個輸入元素可以被映射為0或多個輸出元素(因此func返回一個序列,而不是單一元素)

mapPartitions(func)

類似于map,但獨立地在RDD上每一個分片上運行,因此在類型為T的RDD上運行時,func函數類型必須是Iterator[T]=>Iterator[U]

mapPartitionsWithSplit(func)

類似于mapPartitons,但func帶有一個整數參數表示分片的索引值。因此在類型為T的RDD上運行時,func函數類型必須是(Int,Iterator[T])=>Iterator[U]

sample(withReplacement,fraction,seed)

根據fraction指定的比例對數據進行采樣,可以選擇是否用隨機數進行替換,seed用于隨機數生成器種子

union(otherDataSet)

返回一個新數據集,新數據集是由原數據集和參數數據集聯合而成

distinct([numTasks])

返回一個包含原數據集中所有不重復元素的新數據集

groupByKey([numTasks])

在一個(K,V)數據集上調用,返回一個(K,Seq[V])對的數據集。注意默認情況下,只有8個并行任務來操作,但是可以傳入一個可選的numTasks參數來改變它

reduceByKey(func,[numTasks])

在一個(K,V)對的數據集上調用,返回一個(K,V)對的數據集,使用指定的reduce函數,將相同的key的值聚合到一起。與groupByKey類似,reduceByKey任務的個數是可以通過第二個可選參數來設置的

sortByKey([[ascending],numTasks])

在一個(K,V)對的數據集上調用,K必須實現Ordered接口,返回一個按照Key進行排序的(K,V)對數據集。升序或降序由ascending布爾參數決定

join(otherDataset0,[numTasks])

在類型為(K,V)和(K,W)數據集上調用,返回一個相同的key對應的所有元素在一起的(K,(V,W))數據集

cogroup(otherDataset,[numTasks])

在類型為(K,V)和(K,W)數據集上調用,返回一個(K,Seq[V],Seq[W])元祖的數據集。這個操作也可以稱為groupwith

cartesain(ohterDataset)

笛卡爾積,在類型為T和U類型的數據集上調用,返回一個(T,U)對數據集(兩兩的元素對)

三、RDD支持的常用action如下表

reduce(func)

通過函數func(接收兩個參數,返回一個參數)聚集數據集中的所有元素。這個功能必須可交換且可關聯的,從而可以正確的并行運行

collect()

在驅動程序中,以數組形式返回數據集中的所有元素。通常在使用filter或者其他操作返回一個足夠小的數據子集后再使用會比較有用

count()

返回數據集元素個數

first()

返回數據集第一個元素(類似于take(1))

take(n)

返回一個由數據集前n個元素組成的數組

注意 這個操作目前并非并行執(zhí)行,而是由驅動程序計算所有的元素

takeSample(withReplacement,num,seed)

返回一個數組,該數組由從數據集中隨機采樣的num個元素組成,可以選擇是否由隨機數替換不足的部分,seed用戶指定隨機數生成器種子

saveAsTextFile(path)

將數據集的元素以textfile的形式保存到本地文件系統(tǒng)--HDFS或者任何其他Hadoop支持的文件系統(tǒng)。對于每個元素,Spark將會調用toString方法,將它轉換為文件中的文本行

saveAsSequenceFile(path)

將數據集中的元素以Hadoop sequencefile的格式保存到指定的目錄下,可以是本地系統(tǒng)、HDFS或者任何其他的Hadoop支持的文件系統(tǒng)。這個只限于由key-value對組成,并實現了Hadoop的Writable接口,或者可以隱式的轉換為Writable的RDD(Spark包括了基本類型轉換,例如Int、Double、String等)

countByKey()

對(K,V)類型的RDD有效,返回一個(K,Int)對的map,表示每一個key對應的元素個數

foreach(func)

在數據集的每一個元素上,運行函數func進行更新。通常用于邊緣效果,例如更新一個疊加器,或者和外部存儲系統(tǒng)進行交互,如HBase

?著作權歸作者所有,轉載或內容合作請聯系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

友情鏈接更多精彩內容