RDD運算元介紹
一、RDD運算元簡介
spark在執行過程中通過運算元對RDD進行計算,運算元是RDD中定義的函式,可以對RDD中資料進行轉換和操作,如下圖
輸入:spark程式中資料從外部資料空間輸入到spark中的資料塊,通過BlockManager進行管理
執行:在spark資料形成RDD後,可以通過變換運算元,如filter等對資料進行操作,並將RDD轉換為新的RDD,通過Action運算元,觸發Spark提交作業。如果資料複用,可以通過cache運算元將資料快取到記憶體中。
輸出:程式執行結束後資料會輸出Spark執行時的空間,存在到分散式存在結構(如:saveAsTextFile輸出到HDFS)或者scala的資料集合中。
Spark將常用的大資料操作都轉化成RDD的子類,Spark操作資料模型圖如下;
二、SparkRDD中的運算元分類。
1.Value資料型別的Transformation運算元,這種變化並不觸發提供作業,針對處理的資料項是Value型的資料。
2.Key-Value型別的Transformation運算元,這種變化並不觸發提供作業,針對處理的資料項是Key-Value型的資料
3.Action運算元,這類運算元會觸發SparkContext提交Job作業。
三、RDD Transformation
Transformations是一種演算法描述,標記著需要進行資料操作的資料,但不真正執行,具有Lazy特性,操作延遲,需要等到Actions操作或者Checkpoint操作時,才能真正觸發操作。
RDD轉換,從之前的RDD構建一個新的RDD,像map()和filter()
1.逐元素的Transformation
map()接收函式,把函式應用到RDD的每一個元素,返回新的RDD
var lines2=line.map(word=>(word,1))
filter()接收函式,返回只包含滿足filter()函式的元素的新RDD
var lines3=line.filter(word=word.contains("hello"))
flatMap()接收函式,對每一個輸入元素,輸出多個輸出元素,將RDD中元素壓扁後返回一般新的RDD
val inputs=sc.textFile("/data/shellScript/wordcount")
val lines=inputs.flatMap(line=line.split(","))
二、RDD集合運算
RDD支援數學集合的計算,例如並集、交集計算。
rdd1.distinct()去重
rdd1.union(rdd2) 並集
rdd1.intersecton(rdd2) 交集
rdd1.substact(rdd2) rdd1-rdd2
四、Action
在RDD上計算出一個結果,並把結果返回給driver program或者儲存在檔案系統,count(),save
RDD常用Action:
collect():返回RDD的所有元素
count():計數
countByValue():返回一個map表示唯一元素出現的個數
take(num):返回幾個元素,隨機無序
top(num):返回前幾個元素,排序之後的top
takeOrdered(num)(ordering):返回基於提供的排序演算法的前幾個元素
reduce();接收一個函式,作用在RDD兩個相同型別的元素上,返回新元素,可以實現,RDD中元素的累加,計數和其它型別的聚集操作,for example: rdd.reduce((x,y)=>x+y)
foreach():計算RDD的每一個元素,但不返回到本地