Spark學習之RDD常用操作

一些操作對所有類型的RDD都可以使用,而另一些操作只能在特殊的RDD類型使用。例如只有對於元素都是數字的RDD才能計算平均值。在下面的操作都是在RDD上通用的操作。

Transformations

map() 
Map函數和MapReduce中的map意義相同,即返回一個新RDD,其元素是輸入RDD中元素,按照某個規則得到的新元素。輸入輸出的RDD中包含的元素是一一對應的。 
例如下例中,將nums中的每個元素自乘。 
nums = sc.parallelize([1, 2, 3, 4]) 
squared = nums.map(lambda x: x * x)

flatmap() 
有時需要讓RDD中的一個元素產生多個對應元素。如下例: 
lines = sc.parallelize([“hello world”, “hi”]) 
words = lines.flatMap(lambda line: line.split(” “)) 

filter() 
返回一個新RDD,其元素是輸入RDD元素中符合過濾條件的那些元素。

union() 
返回一個包含兩個輸入RDD元素的新RDD。

intersection() 
返回一個新RDD,其元素是兩個輸入RDD元素的交集。

subtract() 
返回一個新RDD,其元素是第一個輸入RDD的元素且不是第二個輸入RDD的元素。

sample()  
返回一個新RDD,其元素是輸入RDD元素中符合按規則sample出來的那些元素。

Actions

reduce() 
Reduce函數和MapReduce中的Reduce意義相同,用於對RDD中的數據做聚合操作。例如: 
rdd = sc.parallelize([1,2,3,4,5]) 
rdd.reduce(lambda a,b:a+b) 
其中輸入參數爲兩個,輸出1個。a代表聚合結果,b代表RDD中的元素。a+b則表示a=a+b,即將RDD中的所有元素累加到a上,且a爲聚合的結果,15.

count() 
返回RDD元素的個數。

collect() 
有多種方式可以將RDD中的所有元素返回driver program,collect()是常用的一個。大家知道一個RDD的多個分區通常分佈在集羣中的各個節點內存裏,而collect()將這些分散的RDD分區數據全部傳回driver program所在的機器,合併後返回給driver program。 
因此如果數據集很大,可能超過driver program所在機器的內存時,不建議使用collect()。

take(n) 
返回指定個數的RDD元素,返回的元素是隨機的。

top() 
默認安裝RDD中元素的順序返回一個元素,也可以使用比較函數來返回最大或最小的元素。

aggregate() 
和reduce類似,但可以返回不同類型的RDD。

另有一類常用的RDD,稱爲Pair RDD。Pair RDD的元素是一個key value pair組成的元組:

sc.parallelize([(“a”, 3), (“b”, 4), (“a”, 1)]) 
這裏“a”爲key,1爲value。

Pair RDD很常用,因爲我們經常需要按照key對數據做聚合操作。這類RDD操作操作起來略有不同。例如下例,需要對key和value分別處理:

input=sc.parallelize([“1 test string”,”2 test a long string”]) 
pair = input.map(lambda x: (x.split(” “)[0], x))  
result = pair.filter(lambda x: len(x[1]) < 15) 
result.collect()

另外reduce的用法也有變化:

from operator import add 
rdd = sc.parallelize([(“a”, 1), (“b”, 1), (“a”, 1)]) 
sorted(rdd.reduceByKey(add).collect()) 
返回結果:[(‘a’, 2), (‘b’, 1)]

上例需要注意的是,由於調用redueceByKey會導致Spark在各個分區上分別計算當前分區的聚合值,因此redueceByKey不會將結果返回給driver program,在它之後可調用collect()將結果彙總後返回給driver program。

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