spark中的action和transformation
阿新 • • 發佈:2019-02-09
本文提供的是0.7.3版本中的action和transformation介面,RDD提供了兩種型別的操作:transformation和action
1,transformation是得到一個新的RDD,方式很多,比如從資料來源生成一個新的RDD,從RDD生成一個新的RDD
2,action是得到一個值,或者一個結果(直接將RDD cache到記憶體中)
所有的transformation都是採用的懶策略,就是如果只是將transformation提交是不會執行計算的,計算只有在action被提交的時候才被觸發。下面介紹一下RDD的常見操作:(注意是dataset還是RDD)
transformation操作:
1. map(func):對呼叫map的RDD資料集中的每個element都使用func,然後返回一個新的RDD,這個返回的資料集是分散式的資料集 2. filter(func) : 對呼叫filter的RDD資料集中的每個元素都使用func,然後返回一個包含使func為true的元素構成的RDD 3. flatMap(func):和map差不多,但是flatMap生成的是多個結果 4. mapPartitions(func):和map很像,但是map是每個element,而mapPartitions是每個partition 5. mapPartitionsWithSplit(func):和mapPartitions很像,但是func作用的是其中一個split上,所以func中應該有index 6. sample(withReplacement,faction,seed):抽樣 7. union(otherDataset):返回一個新的dataset,包含源dataset和給定dataset的元素的集合 8. distinct([numTasks]):返回一個新的dataset,這個dataset含有的是源dataset中的distinct的element 9. groupByKey(numTasks):返回(K,Seq[V]),也就是hadoop中reduce函式接受的key-valuelist 10. reduceByKey(func,[numTasks]):就是用一個給定的reduce func再作用在groupByKey產生的(K,Seq[V]),比如求和,求平均數 11. sortByKey([ascending],[numTasks]):按照key來進行排序,是升序還是降序,ascending是boolean型別 12. join(otherDataset,[numTasks]):當有兩個KV的dataset(K,V)和(K,W),返回的是(K,(V,W))的dataset,numTasks為併發的任務數 13. cogroup(otherDataset,[numTasks]):當有兩個KV的dataset(K,V)和(K,W),返回的是(K,Seq[V],Seq[W])的dataset,numTasks為併發的任務數 14. cartesian(otherDataset):笛卡爾積就是m*n,大家懂的
action操作:
1. reduce(func):說白了就是聚集,但是傳入的函式是兩個引數輸入返回一個值,這個函式必須是滿足交換律和結合律的 2. collect():一般在filter或者足夠小的結果的時候,再用collect封裝返回一個數組 3. count():返回的是dataset中的element的個數 4. first():返回的是dataset中的第一個元素 5. take(n):返回前n個elements,這個士driver program返回的 6. takeSample(withReplacement,num,seed):抽樣返回一個dataset中的num個元素,隨機種子seed 7. saveAsTextFile(path):把dataset寫到一個text file中,或者hdfs,或者hdfs支援的檔案系統中,spark把每條記錄都轉換為一行記錄,然後寫到file中 8. saveAsSequenceFile(path):只能用在key-value對上,然後生成SequenceFile寫到本地或者hadoop檔案系統 9. countByKey():返回的是key對應的個數的一個map,作用於一個RDD 10. foreach(func):對dataset中的每個元素都使用func
在spark新版中,也許會有更多的action和transformation,可以參照spark的主頁
hadoop提供的介面只有map和reduce函式,spark是mapreduce的擴充套件,提供兩類操作,而不是兩個,使使用更方便,開發時的程式碼量會盡量的被spark的這種多樣的API減少數十倍