Spark算子的作用
下圖描述了Spark在運行轉換中通過算子對RDD進行轉換。 算子是RDD中定義的函數,可以對RDD中的數據進行轉換和操作。

- 輸入:在Spark程序運行中,數據從外部數據空間(如分布式存儲:textFile讀取HDFS等,parallelize方法輸入Scala集合或數據)輸入Spark,數據進入Spark運行時數據空間,轉化為Spark中的數據塊,通過BlockManager進行管理。
- 運行:在Spark數據輸入形成RDD后便可以通過變換算子,如filter等,對數據進行操作并將RDD轉化為新的RDD,通過Action算子,觸發Spark提交作業。 如果數據需要復用,可以通過Cache算子,將數據緩存到內存。
- 輸出:程序運行結束數據會輸出Spark運行時空間,存儲到分布式存儲中(如saveAsTextFile輸出到HDFS),或Scala數據或集合中(collect輸出到Scala集合,count返回Scala int型數據)。
Spark的核心數據模型是RDD,但RDD是個抽象類,具體由各子類實現,如MappedRDD、ShuffledRDD等子類。Spark將常用的大數據操作都轉化成為RDD的子類。

Transformation和Actions操作概況
Transformation具體內容
- map(func) :返回一個新的分布式數據集,由每個原元素經過func函數轉換后組成
- filter(func) : 返回一個新的數據集,由經過func函數后返回值為true的原元素組成
*flatMap(func) : 類似于map,但是每一個輸入元素,會被映射為0到多個輸出元素(因此,func函數的返回值是一個Seq,而不是單一元素) - flatMap(func) : 類似于map,但是每一個輸入元素,會被映射為0到多個輸出元素(因此,func函數的返回值是一個Seq,而不是單一元素)
- sample(withReplacement, frac, seed) :
根據給定的隨機種子seed,隨機抽樣出數量為frac的數據 - union(otherDataset) : 返回一個新的數據集,由原數據集和參數聯合而成
- groupByKey([numTasks]) :
在一個由(K,V)對組成的數據集上調用,返回一個(K,Seq[V])對的數據集。注意:默認情況下,使用8個并行任務進行分組,你可以傳入numTask可選參數,根據數據量設置不同數目的Task - reduceByKey(func, [numTasks]) : 在一個(K,V)對的數據集上使用,返回一個(K,V)對的數據集,key相同的值,都被使用指定的reduce函數聚合到一起。和groupbykey類似,任務的個數是可以通過第二個可選參數來配置的。
- join(otherDataset, [numTasks]) :
在類型為(K,V)和(K,W)類型的數據集上調用,返回一個(K,(V,W))對,每個key中的所有元素都在一起的數據集 - groupWith(otherDataset, [numTasks]) : 在類型為(K,V)和(K,W)類型的數據集上調用,返回一個數據集,組成元素為(K, Seq[V], Seq[W]) Tuples。這個操作在其它框架,稱為CoGroup
- cartesian(otherDataset) : 笛卡爾積。但在數據集T和U上調用時,返回一個(T,U)對的數據集,所有元素交互進行笛卡爾積。
- flatMap(func) :
類似于map,但是每一個輸入元素,會被映射為0到多個輸出元素(因此,func函數的返回值是一個Seq,而不是單一元素)
Actions具體內容
- reduce(func) : 通過函數func聚集數據集中的所有元素。Func函數接受2個參數,返回一個值。這個函數必須是關聯性的,確??梢员徽_的并發執行
- collect() : 在Driver的程序中,以數組的形式,返回數據集的所有元素。這通常會在使用filter或者其它操作后,返回一個足夠小的數據子集再使用,直接將整個RDD集Collect返回,很可能會讓Driver程序OOM
- count() : 返回數據集的元素個數
- take(n) : 返回一個數組,由數據集的前n個元素組成。注意,這個操作目前并非在多個節點上,并行執行,而是Driver程序所在機器,單機計算所有的元素(Gateway的內存壓力會增大,需要謹慎使用)
- first() : 返回數據集的第一個元素(類似于take(1))
- saveAsTextFile(path) : 將數據集的元素,以textfile的形式,保存到本地文件系統,hdfs或者任何其它hadoop支持的文件系統。Spark將會調用每個元素的toString方法,并將它轉換為文件中的一行文本
- saveAsSequenceFile(path) : 將數據集的元素,以sequencefile的格式,保存到指定的目錄下,本地系統,hdfs或者任何其它hadoop支持的文件系統。RDD的元素必須由key-value對組成,并都實現了Hadoop的Writable接口,或隱式可以轉換為Writable(Spark包括了基本類型的轉換,例如Int,Double,String等等)
- foreach(func) : 在數據集的每一個元素上,運行函數func。這通常用于更新一個累加器變量,或者和外部存儲系統做交互
算子分類
大致可以分為三大類算子:
- Value數據類型的Transformation算子,這種變換并不觸發提交作業,針對處理的數據項是Value型的數據。
- Key-Value數據類型的Transfromation算子,這種變換并不觸發提交作業,針對處理的數據項是Key-Value型的數據對。
- Action算子,這類算子會觸發SparkContext提交Job作業。
轉載請注明作者Jason Ding及其出處
GitCafe博客主頁(http://jasonding1354.gitcafe.io/)
Github博客主頁(http://jasonding1354.github.io/)
CSDN博客(http://blog.csdn.net/jasonding1354)
簡書主頁(http://www.lxweimin.com/users/2bd9b48f6ea8/latest_articles)
Google搜索jasonding1354進入我的博客主頁