spark算子實戰(三)

這篇文章將繼續介紹spark算子之Actions算子。

Actions算子

算子 說明
foreach 對RDD中的每個元素應用f函數。
saveAsTextFile 將RDD保存爲文本文件。路徑path可以是本地路徑或HDFS地址,保存方法是對RDD成員調用toString函數。
saveAsObjectFile 用於將RDD中的元素序列化成對象,存儲到文件中。對於HDFS,默認採用SequenceFile保存
collect 以Array的形式返回RDD中的所有元素,僅限數據量比較少的時候使用。
collectAsMap 返回hashMap包含所有RDD中的分片,key如果重複,後邊的元素會覆蓋前面的元素。
reduceByKeyLocally 將RDD[K,V]中每個K對應的V值根據映射函數來運算,運算結果映射到一個Map[K,V]中,而不是RDD[K,V]。相當於先執行reduce,再執行collectAsMap。
lookup 用於[K,V]類型的RDD,根據指定的K值,查找該K對應的所有V值並返回。
count 返回RDD中元素的個數。
first 返回RDD中的第一個元素,不排序。
top 用於從RDD中,按照默認(降序)或者指定的排序規則,返回前num個元素。
take take用於獲取RDD中從0到num-1下標的元素,不排序。
takeOrdered 與top類似,只不過以和top相反的順序返回元素。
reduce 根據映射函數f,對RDD中的元素進行二元計算,返回計算結果。
fold 使用給定的關聯函數和“zero value”來聚合RDD中每個分區的元素,然後聚合所有分區的結果。結果爲:(分區數+1)*(zero value)+所有元素的和
aggregate 用於聚合RDD中的元素,先使用第一個函數(seqOp)將RDD中每個分區中的T類型元素聚合成U類型,再使用第二個函數(combOp)將之前每個分區聚合後的U類型聚合成U類型,特別注意seqOp和combOp都會使用zeroValue的值,zeroValue的類型爲U。

1.foreach

實例1
scala代碼

def f(x:String):Unit={
    println("hello "+x)
} 
val a = sc.parallelize(List("tom", "lucy", "alex", "july", "alina", "andy"), 2)
a.foreach(f)

結果:
這裏寫圖片描述

python代碼

def f(x): print("hello "+x)
a = sc.parallelize(["tom", "lucy", "alex", "july", "alina", "andy"], 2)
a.foreach(f)

結果:
這裏寫圖片描述

2.saveAsTextFile

實例1
scala代碼

val a = sc.parallelize(1 to 1000,3)
a.saveAsTextFile("/root/1.txt")

結果:
這裏寫圖片描述

也可將文件保存到hdfs上,代碼如下:

val a = sc.parallelize(1 to 1000,3)
a.saveAsTextFile("hdfs://master:9000/user/root/1.txt")

結果:
這裏寫圖片描述

python代碼

a = sc.parallelize(range(1 , 1000+1),3)
a.saveAsTextFile("/root/2.txt")

結果:
這裏寫圖片描述

3.saveAsObjectFile

實例1
scala代碼

val a = sc.parallelize(1 to 10,3)
a.saveAsObjectFile("/root/objFile")
val b = sc.objectFile[Int]("/root/objFile")
b.collect

結果:
這裏寫圖片描述

注:pyspark中無此api

4.collect

實例1
scala代碼

val a = sc.parallelize(List("tom", "lucy", "alex", "july", "alina", "andy"), 2)
a.collect

結果:
這裏寫圖片描述
python代碼

a = sc.parallelize(["tom", "lucy", "alex", "july", "alina", "andy"], 2)
a.collect()

結果:
這裏寫圖片描述

5.collectAsMap

實例1
scala代碼

val a = sc.parallelize(List(1,2,1,3),2)
val b = sc.parallelize(List('a','b','c','d'),2)
val c = a.zip(b)
c.collectAsMap

結果:
這裏寫圖片描述

python代碼

a = sc.parallelize([1,2,1,3],2)
b = sc.parallelize(['a','b','c','d'],2)
c = a.zip(b)
c.collectAsMap()

結果:
這裏寫圖片描述

6.reduceByKeyLocally

實例1
scala代碼

val a = sc.parallelize(List(("a",1),("a",2),("b",2),("b",3),("c",1)))
a.reduceByKeyLocally((x,y) => x + y)

結果:
這裏寫圖片描述
python代碼

a = sc.parallelize([("a",1),("a",2),("b",2),("b",3),("c",1)])
a.reduceByKeyLocally(lambda x,y:x+y)

結果:
這裏寫圖片描述

7.lookup

實例1
scala代碼

val a = sc.parallelize(List((1,"tom"), (2,"lucy"), (3,"alex"), (4,"july"), (5,"alina"), (6,"andy")), 2)
a.lookup(2)
a.lookup(2)

結果:
這裏寫圖片描述

python代碼

a = sc.parallelize([(1,"tom"), (2,"lucy"), (3,"alex"), (4,"july"), (5,"alina"), (6,"andy")], 2)
a.lookup(2)
a.lookup(5)

結果:
這裏寫圖片描述

8.count

實例1
scala代碼

val a = sc.parallelize(List((1,"tom"), (2,"lucy"), (3,"alex"), (4,"july"), (5,"alina"), (6,"andy")), 2)
a.count

結果:
這裏寫圖片描述

python代碼

a = sc.parallelize([(1,"tom"), (2,"lucy"), (3,"alex"), (4,"july"), (5,"alina"), (6,"andy")], 2)
a.count()

結果:
這裏寫圖片描述

9.first

實例1
scala代碼

val a = sc.parallelize(List((1,"tom"), (2,"lucy"), (3,"alex"), (4,"july"), (5,"alina"), (6,"andy")), 2)
a.first

結果:
這裏寫圖片描述

python代碼

a = sc.parallelize([(1,"tom"), (2,"lucy"), (3,"alex"), (4,"july"), (5,"alina"), (6,"andy")], 2)
a.first()

結果:
這裏寫圖片描述

10.top、takeOrdered

實例1
scala代碼

val a = sc.parallelize(List((1,"tom"), (2,"lucy"), (3,"alex"), (4,"july"), (5,"alina"), (6,"andy")), 2)
a.top(3)

結果:

這裏寫圖片描述

a.takeOrdered(3)

結果:
這裏寫圖片描述
python代碼

a = sc.parallelize([(1,"tom"), (2,"lucy"), (3,"alex"), (4,"july"), (5,"alina"), (6,"andy")], 2)
a.top(3)

結果:
這裏寫圖片描述

a.takeOrdered(3)

結果:
這裏寫圖片描述

11.take

實例1
scala代碼

val a = sc.parallelize(List((1,"tom"), (2,"lucy"), (3,"alex"), (4,"july"), (5,"alina"), (6,"andy")), 2)
a.take(3)

結果:
這裏寫圖片描述
python代碼

a = sc.parallelize([(1,"tom"), (2,"lucy"), (3,"alex"), (4,"july"), (5,"alina"), (6,"andy")], 2)
a.take(3)

結果:
這裏寫圖片描述

12.reduce

實例1
scala代碼

val a = sc.parallelize(1 to 10,3)
a.reduce(_+_)

結果:
這裏寫圖片描述

python代碼

a = sc.parallelize(range(1 , 10+1),3)
a.reduce(lambda x,y:x+y)

結果:
這裏寫圖片描述

13.fold

實例1
scala代碼

val a = sc.parallelize(List(1, 2, 3, 4, 5),3)
a.fold(0)(_+_)

結果:
這裏寫圖片描述

val a = sc.parallelize(List(1, 2, 3, 4, 5),3)
a.fold(2)(_+_)

結果:
這裏寫圖片描述

結果爲什麼是23呢?先查看分區情況:
這裏寫圖片描述

接下來給出具體的計算過程:
首先,聚合每個分區中的元素
part0:zero value+1=2+1=3
part1:zero value+2+3=2+2+3=7
part2:zero value+4+5=2+4+5=11
然後聚合所有分區的結果:
zero value+3+7+11=2+3+7+11=23
所以,可以總結一下得到,結果爲:(分區數+1)*(zero value)+所有元素的和=(3+1)*2+1+2+3+4+5=23

python代碼

from operator import add
a = sc.parallelize([1, 2, 3, 4, 5],3)
a.fold(0,add)

結果:
這裏寫圖片描述

from operator import add
a = sc.parallelize([1, 2, 3, 4, 5],3)
a.fold(2,add)

結果:
這裏寫圖片描述

13.aggregate

實例1
scala代碼

val a = sc.parallelize(List(1, 2, 3, 4),2)
a.aggregate(0)(_+_,_+_)

結果:
這裏寫圖片描述

結果爲什麼是10呢?下面給出計算過程(元素分區情況如下圖:)

這裏寫圖片描述

首先使用第一個函數(加法)聚合每個分區中的元素
part0:zero value+1+2=0+1+2=3
part1:zero value+3+4=0+3+4=7
再使用第二個函數(加法)聚合每個分區的結果
zero value+3+7=0+3+7=10

python代碼

seqOp = (lambda x, y: x+y)
combOp = (lambda x, y: x+y)
a = sc.parallelize([1, 2, 3, 4],2)
a.aggregate(0, seqOp, combOp)

結果:
這裏寫圖片描述

實例2
scala代碼

val a = sc.parallelize(List(1, 2, 3, 4))
a.aggregate(2)(_*_,_+_)

結果:
這裏寫圖片描述

結果爲什麼是30呢?下面給出計算過程(元素分區情況如下圖:)

這裏寫圖片描述

首先使用第一個函數(乘法)聚合每個分區中的元素
part0:zero value*1*2=2*1*2=4
part1:zero value*3*4=2*3*4=24
再使用第二個函數(加法)聚合每個分區的結果
zero value+4+24=2+4+24=30

python代碼

seqOp = (lambda x, y: x*y)
combOp = (lambda x, y: x+y)
a = sc.parallelize([1, 2, 3, 4],2)
a.aggregate(2, seqOp, combOp)

結果:
這裏寫圖片描述

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