spark學習筆記1 spark算子

 1、map和flatMap的區別

Spark 中 map函數會對每一條輸入進行指定的操作,然後爲每一條輸入返回一個對象。而flatMap函數則是兩個操作的集合——正是“先映射後扁平化”:

   操作1:同map函數一樣:對每一條輸入進行指定的操作,然後爲每一條輸入返回一個對象

   操作2:最後將所有對象合併爲一個對象

2、mapPartitions

該函數和map函數類似,只不過映射函數的參數由RDD中的每一個元素變成了RDD中每一個分區的迭代器。如果在映射的過程中需要頻繁創建額外的對象,使用mapPartitions要比map高效的過。

兩者的主要區別是調用的粒度不一樣:map的輸入變換函數是應用於RDD中每個元素,而mapPartitions的輸入函數是應用於每個分區。

scala> val a = sc.parallelize(1 to 9, 3)
scala> val b = a.map(x => x*2)
scala> a.collect
res10: Array[Int] = Array(1, 2, 3, 4, 5, 6, 7, 8, 9)
scala> b.collect
res11: Array[Int] = Array(2, 4, 6, 8, 10, 12, 14, 16, 18)
scala> val a = sc.parallelize(1 to 9, 3)
scala> def myfunc[T](iter: Iterator[T]) : Iterator[(T, T)] = {
    var res = List[(T, T)]() 
    var pre = iter.next while (iter.hasNext) {
        val cur = iter.next; 
        res .::= (pre, cur) pre = cur;
    } 
    res.iterator
}
scala> a.mapPartitions(myfunc).collect
res0: Array[(Int, Int)] = Array((2,3), (1,2), (5,6), (4,5), (8,9), (7,8))
map就是把分區內的每個元素分開傳入,而mapPartitions則是把一個分區全部傳入,代碼的結果是相同的,只是節約了傳入數據的損耗。
所以,這兩個方法的一個區別是在大數據集情況下的資源初始化開銷和批處理處理,比如在數據庫連接。在上面的例子中,mapPartition只需初始化3個資源(3個分區每個1次),而map要初始化10次(10個元素每個1次)。在大數據集情況下(數據集中元素個數遠大於分區數)mapPartitons的開銷要小很多,也便於進行批處理操作。
3、glom
將每一個分區內的元素整合在一個數組中。
4、union intersection subtract
該函數返回兩個RDD的交集,並且不去重
該函數返回兩個RDD的交集,並且去重
該函數類似於intersection,但返回在RDD中出現,並且不在otherRDD中出現的元素,不去重。參數含義同intersection
在保證數據類型相同的情況下,返回合併後的數據集。不進行去重操作,但可以通過distinct()去重
5、cartesian
兩個rdd形成笛卡爾集,新的rdd的分區數爲舊的之積
6、groupBy
按照key值分類成組
7、filter
滿足條件的保留,比如
x.filter(a=>a.contains("-")==false)
8、distinct()
去重
9、sample takeSample
sample(withReplacement,fraction, seed)	第一個參數withReplacementtrue表示有放回取樣,false表示無放回。第二個參數表示比例,第三個參數是隨機種子。如data.sample(true, 0.3,new Random().nextInt())
10、Cache。將RDD緩存到內存中。相當於persist(MEMORY_ONLY)。可以通過參數設置緩存和運行內存之間的比例,如果數據量大於cache內存則會丟失。
Persist。裏面參數可以選擇DISK_ONLY/MEMORY_ONLY/MEMORY_AND_DISK等,其中的MEMORY_AND_DISK當緩存空間滿了後自動溢出到磁盤。
11、mapValues
針對(key,value)中的數據value進行map操作,而不對key操作
12、combineByKey
combineByKey屬於Key-Value型算子,做的是聚集操作,這種變換不會觸發作業的提交,主要有三個參數,分別是:
combiner function : 一個組合函數,用於將RDD[K,V]中的V轉換成一個新的值C1;
mergeValue function :合併值函數,將一個C1類型值和一個V類型值合併成一個C2類型,輸入參數爲(C1,V),輸出爲新的C2
mergeCombiners function :合併組合器函數,用於將兩個C2類型值合併成一個C3類型,輸入參數爲(C2,C2),輸出爲新的C3
scala> var rdd1 = sc.makeRDD(Array(("A",1),("A",2),("B",1),("B",2),("C",1)))
rdd1: org.apache.spark.rdd.RDD[(String, Int)] = ParallelCollectionRDD[64] at makeRDD at :21
 
scala> rdd1.combineByKey(
     |       (v : Int) => v + "_",   
     |       (c : String, v : Int) => c + "@" + v,  
     |       (c1 : String, c2 : String) => c1 + "$" + c2
     |     ).collect
res60: Array[(String, String)] = Array((A,2_$1_), (B,1_$2_), (C,1_))

outInfo.combineByKey(
  (v) => (1, v),
  (acc: (Int, String), v) => (acc._1 + 1, acc._2),
  (acc1: (Int, String), acc2: (Int, String)) => (acc1._1 + acc2._1, acc2._2)
).sortBy(_._2, false).map{
  case (key, (key1, value)) => Array(key, key1.toString, value).mkString("\t")
}.saveAsTextFile("/out")
點擊打開鏈接
13、reduceByKey
針對KV數據將相同keyvalue聚合到一起。與groupByKey不同,會進行一個類似mapreduce中的combine操作,減少相應的數據IO操作,加快效率。如果想進行一些非疊加操作,我們可以將value組合成字符串或其他格式將相同keyvalue組合在一起,再通過迭代,組合的數據拆開操作。
14、
15、Cogroup。對兩個RDD中的KV元素,每個RDD中相同key中的元素分別聚合成一個集合。與reduceByKey不同的是針對兩個RDD中相同的key的元素進行合併。

action算子

1、無輸出   foreach
2、輸出到HDFS http://lxw1234.com/archives/2015/07/402.htm
3、collect,collectAsMap
collect將分佈式的rdd返回爲一個單機的scala array 數組。
collectAsMap
scala> val data = sc.parallelize(List((1, "www"), (1, "iteblog"), (1, "com"), 
    (2, "bbs"), (2, "iteblog"), (2, "com"), (3, "good")))
data: org.apache.spark.rdd.RDD[(Int, String)] =
    ParallelCollectionRDD[26] at parallelize at <console>:12
 
scala> data.collectAsMap
res28: scala.collection.Map[Int,String] = Map(2 -> com, 1 -> com, 3 -> good)
4、count
5、top(num:int)
top:最大的k個元素
take:最小的k個元素
takeOrdered:返回並保存元素順序
first:top(1)
6、reduce
將RDD中元素兩兩傳遞給輸入函數,同時產生一個新的值,新產生的值與RDD中下一個元素再被傳遞給輸入函數直到最後只有一個值爲止。

舉例 scala> val c = sc.parallelize(1 to 10) scala> c.reduce((x, y) => x + y) res4: Int = 55 上述例子對RDD中的元素求和。

7、fold aggregate

http://www.cnblogs.com/sharpxiajun/p/5513612.html

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