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]分區數。