一、概述
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