在上篇博文中已經討論過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或者其它操作後,返回一個足夠小的數據子集再使用,直接將整個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。這通常用於更新一個累加器變量,或者和外部存儲系統做交互 |
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)對組成的數據集上調用,返回一個(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,而不是單一元素) |
此篇博文的內容沒有太多技術點,只是將RDD的方法進行分類,能夠更好的理解和使用RDD完成數據操作,所以希望能給初學spark的同行一些幫助。