這篇文章將繼續介紹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)
結果: