spark小記——32個常用算子總結

原文鏈接:https://blog.csdn.net/Fortuna_i/article/details/81170565

Transformation

1.map

map的輸入變換函數應用於RDD中所有元素,而mapPartitions應用於所有分區。區別於mapPartitions主要在於調用粒度不同。如parallelize(1 to 10, 3),map函數執行10次,而mapPartitions函數執行3次。

2.filter(function)

過濾操作,滿足filter內function函數爲true的RDD內所有元素組成一個新的數據集。如:filter(a == 1)。

3.flatMap(function)

map是對RDD中元素逐一進行函數操作映射爲另外一個RDD,而flatMap操作是將函數應用於RDD之中的每一個元素,將返回的迭代器的所有內容構成新的RDD。而flatMap操作是將函數應用於RDD中每一個元素,將返回的迭代器的所有內容構成RDD。

flatMap與map區別在於map爲“映射”,而flatMap“先映射,後扁平化”,map對每一次(func)都產生一個元素,返回一個對象,而flatMap多一步就是將所有對象合併爲一個對象。

4.mapPartitions(function)

區於foreachPartition(屬於Action,且無返回值),而mapPartitions可獲取返回值。與map的區別前面已經提到過了,但由於單獨運行於RDD的每個分區上(block),所以在一個類型爲T的RDD上運行時,(function)必須是Iterator<T> => Iterator<U>類型的方法(入參)。

5.mapPartitionsWithIndex(function)

與mapPartitions類似,但需要提供一個表示分區索引值的整型值作爲參數,因此function必須是(int, Iterator<T>)=>Iterator<U>類型的。

6.sample(withReplacement, fraction, seed)

採樣操作,用於從樣本中取出部分數據。withReplacement是否放回,fraction採樣比例,seed用於指定的隨機數生成器的種子。(是否放回抽樣分true和false,fraction取樣比例爲(0, 1]。seed種子爲整型實數。)

7.union(otherDataSet)

對於源數據集和其他數據集求並集,不去重。

8.intersection(otherDataSet)

對於源數據集和其他數據集求交集,並去重,且無序返回。

9.distinct([numTasks])

返回一個在源數據集去重之後的新數據集,即去重,並局部無序而整體有序返回。(詳細介紹見

https://blog.csdn.net/Fortuna_i/article/details/81506936)

注:之後groupByKey、reduceByKey、aggregateByKey、sortByKey、join、cogroup等Transformation操作均包含[numTasks]任務數這個參數,參考上一行鏈接理解。

注:之後要用到很多對pairRDD進行的操作,在此添加pairRDD簡易創建過程。

10.groupByKey([numTasks])

在一個PairRDD或(k,v)RDD上調用,返回一個(k,Iterable<v>)。主要作用是將相同的所有的鍵值對分組到一個集合序列當中,其順序是不確定的。groupByKey是把所有的鍵值對集合都加載到內存中存儲計算,若一個鍵對應值太多,則易導致內存溢出。

在此,用之前求並集的union方法,將pair1,pair2變爲有相同鍵值的pair3,而後進行groupByKey

11.reduceByKey(function,[numTasks])

與groupByKey類似,卻有不同。如(a,1), (a,2), (b,1), (b,2)。groupByKey產生中間結果爲( (a,1), (a,2) ), ( (b,1), (b,2) )。而reduceByKey爲(a,3), (b,3)。

reduceByKey主要作用是聚合,groupByKey主要作用是分組。(function對於key值來進行聚合)

12.aggregateByKey(zeroValue)(seqOp, combOp, [numTasks])

類似reduceByKey,對pairRDD中想用的key值進行聚合操作,使用初始值(seqOp中使用,而combOpenCL中未使用)對應返回值爲pairRDD,而區於aggregate(返回值爲非RDD)

13.sortByKey([ascending], [numTasks])

同樣是基於pairRDD的,根據key值來進行排序。ascending升序,默認爲true,即升序;numTasks

14.join(otherDataSet,[numTasks])

加入一個RDD,在一個(k,v)和(k,w)類型的dataSet上調用,返回一個(k,(v,w))的pair dataSet。

15.cogroup(otherDataSet,[numTasks])

合併兩個RDD,生成一個新的RDD。實例中包含兩個Iterable值,第一個表示RDD1中相同值,第二個表示RDD2中相同值(key值),這個操作需要通過partitioner進行重新分區,因此需要執行一次shuffle操作。(若兩個RDD在此之前進行過shuffle,則不需要)

16.cartesian(otherDataSet)

求笛卡爾乘積。該操作不會執行shuffle操作。

17.pipe(command,[envVars])

通過一個shell命令來對RDD各分區進行“管道化”。通過pipe變換將一些shell命令用於Spark中生成的新RDD,如:

(借圖,莫怪^_^)

18.coalesce(numPartitions)

重新分區,減少RDD中分區的數量到numPartitions。

19.repartition(numPartitions)

repartition是coalesce接口中shuffle爲true的簡易實現,即Reshuffle RDD並隨機分區,使各分區數據量儘可能平衡。若分區之後分區數遠大於原分區數,則需要shuffle。

20.repartitionAndSortWithinPartitions(partitioner)

該方法根據partitioner對RDD進行分區,並且在每個結果分區中按key進行排序。

 

Action

1.reduce(function)

reduce將RDD中元素兩兩傳遞給輸入函數,同時產生一個新值,新值與RDD中下一個元素再被傳遞給輸入函數,直到最後只有一個值爲止。

2.collect()

將一個RDD以一個Array數組形式返回其中的所有元素。(具體內容參見:

https://blog.csdn.net/Fortuna_i/article/details/80851775)

3.count()

返回數據集中元素個數,默認Long類型。

4.first()

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

5.takeSample(withReplacement, num, [seed])

對於一個數據集進行隨機抽樣,返回一個包含num個隨機抽樣元素的數組,withReplacement表示是否有放回抽樣,參數seed指定生成隨機數的種子。

該方法僅在預期結果數組很小的情況下使用,因爲所有數據都被加載到driver端的內存中。

6.take(n)

返回一個包含數據集前n個元素的數組(從0下標到n-1下標的元素),不排序。

7.takeOrdered(n,[ordering])

返回RDD中前n個元素,並按默認順序排序(升序)或者按自定義比較器順序排序。

8.saveAsTextFile(path)

將dataSet中元素以文本文件的形式寫入本地文件系統或者HDFS等。Spark將對每個元素調用toString方法,將數據元素轉換爲文本文件中的一行記錄。

若將文件保存到本地文件系統,那麼只會保存在executor所在機器的本地目錄。

9.saveAsSequenceFile(path)(Java and Scala)

將dataSet中元素以Hadoop SequenceFile的形式寫入本地文件系統或者HDFS等。(對pairRDD操作)

10.saveAsObjectFile(path)(Java and Scala)

將數據集中元素以ObjectFile形式寫入本地文件系統或者HDFS等。

11.countByKey()

用於統計RDD[K,V]中每個K的數量,返回具有每個key的計數的(k,int)pairs的hashMap。

12.foreach(function)

對數據集中每一個元素運行函數function。

補充:Spark2.3及之後的官方文檔中將原[numTasks]任務數參數改爲了[numPartitions]分區數。

 

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