BigData進階--Spark的RDD操作

   在上篇博文中已經討論過Spark的RDD和DataFrame,這篇就來探究一下RDD集的具體操作。

   Spark中RDD是一個不可變的分佈式對象集合,每個RDD都被分成多個分區,這些分區運行在集羣中的不同節點上。用戶可以通過兩種方式來創建RDD集合:讀取外部數據集和在驅動器程序裏分發驅動器程序中的對象集合(比如list和set)。創建完成後,RDD支持轉化操作和行爲操作,通俗的來講,就是將RDD集合所支持的方法按照RDD是否執行了計算來分類,分成轉化(transformation)和行爲(action)兩類。

1.action操作的方法

reduce(func)

通過函數func聚集數據集中的所有元素。Func函數接受2個參數,返回一個值。這個函數必須是關聯性的,確保可以被正確的併發執行

collect()

Driver的程序中,以數組的形式,返回數據集的所有元素。這通常會在使用filter或者其它操作後,返回一個足夠小的數據子集再使用,直接將整個RDDCollect返回,很可能會讓Driver程序OOM

count()

返回數據集的元素個數

take(n)

返回一個數組,由數據集的前n個元素組成。注意,這個操作目前並非在多個節點上,並行執行,而是Driver程序所在機器,單機計算所有的元素(Gateway的內存壓力會增大,需要謹慎使用)

first()

返回數據集的第一個元素(類似於take1

saveAsTextFile(path)

將數據集的元素,以textfile的形式,保存到本地文件系統,hdfs或者任何其它hadoop支持的文件系統。Spark將會調用每個元素的toString方法,並將它轉換爲文件中的一行文本

saveAsSequenceFile(path)

將數據集的元素,以sequencefile的格式,保存到指定的目錄下,本地系統,hdfs或者任何其它hadoop支持的文件系統。RDD的元素必須由key-value對組成,並都實現了HadoopWritable接口,或隱式可以轉換爲WritableSpark包括了基本類型的轉換,例如IntDoubleString等等)

foreach(func)

在數據集的每一個元素上,運行函數func。這通常用於更新一個累加器變量,或者和外部存儲系統做交互

2.Transformation

map(func)

  

返回一個新的分佈式數據集,由每個原元素經過func函數轉換後組成

filter(func)

返回一個新的數據集,由經過func函數後返回值爲true的原元素組成

flatMap(func)

類似於map,但是每一個輸入元素,會被映射爲0到多個輸出元素(因此,func函數的返回值是一個Seq,而不是單一元素)

sample(withReplacement,  frac, seed)

根據給定的隨機種子seed,隨機抽樣出數量爲frac的數據

union(otherDataset)

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

groupByKey([numTasks])

在一個由(K,V)對組成的數據集上調用,返回一個(KSeq[V])對的數據集。注意:默認情況下,使用8個並行任務進行分組,你可以傳入numTask可選參數,根據數據量設置不同數目的Task

reduceByKey(func,  [numTasks])

在一個(KV)對的數據集上使用,返回一個(KV)對的數據集,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)

  笛卡爾積。但在數據集TU上調用時,返回一個(TU)對的數據集,所有元素交互進行笛卡爾積。

flatMap(func)

類似於map,但是每一個輸入元素,會被映射爲0到多個輸出元素(因此,func函數的返回值是一個Seq,而不是單一元素)

            轉化操作和行爲操作的區別在於spark對RDD計算方式的不同,轉化操作會有一個RDD生成一個新的RDD,但是並不對數據進行計算;行動操作會對RDD計算出一個結果,並把結果返回到驅動器程序中,或者把結果存儲到一個外部程序中,比如hdfs。

   此篇博文的內容沒有太多技術點,只是將RDD的方法進行分類,能夠更好的理解和使用RDD完成數據操作,所以希望能給初學spark的同行一些幫助。

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