RDD操作

1.14 transformation和action

Spark支持兩種RDD操作:transformation和action掌动。transformation操作會(huì)針對(duì)已有的RDD創(chuàng)建一個(gè)新的RDD抵碟;而action則主要是對(duì)RDD進(jìn)行最后的操作,比如遍歷坏匪、reduce拟逮、保存到文件等,并可以返回結(jié)果給Driver程序适滓。

例如敦迄,map就是一種transformation操作,它用于將已有RDD的每個(gè)元素傳入一個(gè)自定義的函數(shù)凭迹,并獲取一個(gè)新的元素罚屋,然后將所有的新元素組成一個(gè)新的RDD。而reduce就是一種action操作嗅绸,它用于對(duì)RDD中的所有元素進(jìn)行聚合操作脾猛,并獲取一個(gè)最終的結(jié)果,然后返回給Driver程序鱼鸠。

transformation的特點(diǎn)就是lazy特性猛拴。lazy特性指的是,如果一個(gè)spark應(yīng)用中只定義了transformation操作蚀狰,那么即使你執(zhí)行該應(yīng)用愉昆,這些操作也不會(huì)執(zhí)行。也就是說麻蹋,transformation是不會(huì)觸發(fā)spark程序的執(zhí)行的跛溉,它們只是記錄了對(duì)RDD所做的操作,但是不會(huì)自發(fā)的執(zhí)行。只有當(dāng)transformation之后芳室,接著執(zhí)行了一個(gè)action操作专肪,那么所有的transformation才會(huì)執(zhí)行。Spark通過這種lazy特性堪侯,來進(jìn)行底層的spark應(yīng)用執(zhí)行的優(yōu)化嚎尤,避免產(chǎn)生過多中間結(jié)果。

action操作執(zhí)行抖格,會(huì)觸發(fā)一個(gè)spark job的運(yùn)行诺苹,從而觸發(fā)這個(gè)action之前所有的transformation的執(zhí)行。這是action的特性雹拄。

transformation和action原理剖析

transformation和action原理剖析.png

val lines = sc.textFile("spark.txt")
通過textFile()方法收奔,針對(duì)外部文件創(chuàng)建了一個(gè)RDD——lines,但是實(shí)際上滓玖,程序執(zhí)行到這里為止坪哄,spark.txt文件的數(shù)據(jù)是不會(huì)加載到內(nèi)存中的。lines只是代表了一個(gè)指向spark.txt文件的引用势篡。

val lineLengths = lines.map(line => line.length)
這里對(duì)lines RDD進(jìn)行了map算子翩肌,獲取了一個(gè)轉(zhuǎn)換后的lineLengths RDD。但是這里連數(shù)據(jù)都沒有禁悠,當(dāng)然也不會(huì)做任何操作念祭。lineLengths RDD也只是一個(gè)概念上的東西而已。

val totalLength = lineLengths.reduce(_ + _)
之后碍侦,執(zhí)行了一個(gè)action操作——reduce粱坤。此時(shí)就會(huì)觸發(fā)之前所有transformation操作的執(zhí)行,Spark會(huì)將操作拆分成多個(gè)task到多個(gè)機(jī)器上并行執(zhí)行瓷产,每個(gè)task會(huì)在本地執(zhí)行map操作站玄,并且進(jìn)行本地的reduce聚合。最后會(huì)進(jìn)行一個(gè)全局的reduce聚合濒旦,然后將結(jié)果返回給Driver程序株旷。

注意,Spark有些特殊的算子尔邓,也就是特殊的transformation操作晾剖。比如groupByKeysortByKey铃拇、reduceByKey等钞瀑,其實(shí)只是針對(duì)特殊的RDD的。即包含key-value對(duì)的RDD慷荔。而這種RDD中的元素,實(shí)際上是scala中的一種類型,即Tuple2显晶,也就是包含兩個(gè)值的Tuple贷岸。

在scala中,需要手動(dòng)導(dǎo)入Spark的相關(guān)隱式轉(zhuǎn)換磷雇,import org.apache.spark.SparkContext._偿警。然后,對(duì)應(yīng)包含Tuple2的RDD唯笙,會(huì)自動(dòng)隱式轉(zhuǎn)換為PairRDDFunction螟蒸,并提供reduceByKey等方法。

import org.apache.spark.SparkConf;
import org.apache.spark.api.java.JavaPairRDD;
import org.apache.spark.api.java.JavaRDD;
import org.apache.spark.api.java.JavaSparkContext;
import org.apache.spark.api.java.function.Function2;
import org.apache.spark.api.java.function.PairFunction;
import org.apache.spark.api.java.function.VoidFunction;

import scala.Tuple2;

/**
 * 統(tǒng)計(jì)每行出現(xiàn)的次數(shù)
 * @author Administrator
 *
 */
public class LineCount {

    public static void main(String[] args) {
        // 創(chuàng)建SparkConf
        SparkConf conf = new SparkConf()
                .setAppName("LineCount")
                .setMaster("local"); 
        // 創(chuàng)建JavaSparkContext
        JavaSparkContext sc = new JavaSparkContext(conf);
    
        // 創(chuàng)建初始RDD崩掘,lines七嫌,每個(gè)元素是一行文本
        JavaRDD<String> lines = sc.textFile("C://Users//Administrator//Desktop//hello.txt");
        
        // 對(duì)lines RDD執(zhí)行mapToPair算子,將每一行映射為(line, 1)的這種key-value對(duì)的格式
        // 然后后面才能統(tǒng)計(jì)每一行出現(xiàn)的次數(shù)
        JavaPairRDD<String, Integer> pairs = lines.mapToPair(
                
                new PairFunction<String, String, Integer>() {

                    private static final long serialVersionUID = 1L;
                    
                    @Override
                    public Tuple2<String, Integer> call(String t) throws Exception {
                        return new Tuple2<String, Integer>(t, 1);  // key-value對(duì)里面的元素是Tuple2
                    }
                    
                });
        
        // 對(duì)pairs RDD執(zhí)行reduceByKey算子苞慢,統(tǒng)計(jì)出每一行出現(xiàn)的總次數(shù)
        JavaPairRDD<String, Integer> lineCounts = pairs.reduceByKey(
                
                new Function2<Integer, Integer, Integer>() {
            
                    private static final long serialVersionUID = 1L;
                    
                    @Override
                    public Integer call(Integer v1, Integer v2) throws Exception {
                        return v1 + v2;
                    }
                    
                });
        
        // 執(zhí)行一個(gè)action操作诵原,foreach,打印出每一行出現(xiàn)的次數(shù)
        lineCounts.foreach(new VoidFunction<Tuple2<String,Integer>>() {
            
            private static final long serialVersionUID = 1L;
            
            @Override
            // lineCounts里面的元素是Tuple2
            public void call(Tuple2<String, Integer> t) throws Exception {
                System.out.println(t._1 + " appears " + t._2 + " times.");  
            }
            
        });
        
        // 關(guān)閉JavaSparkContext
        sc.close();
    }
}
// 統(tǒng)計(jì)文件每一行出現(xiàn)的次數(shù)
val lines = sc.textFile("hello.txt")
val linePairs = lines.map(line => (line, 1))
val lineCounts = linePairs.reduceByKey(_ + _)
lineCounts.foreach(lineCount => println(lineCount._1 + " appears " + llineCount._2 + " times."))

常用transformation和action

transformation

action
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末挽放,一起剝皮案震驚了整個(gè)濱河市绍赛,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌辑畦,老刑警劉巖吗蚌,帶你破解...
    沈念sama閱讀 216,591評(píng)論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異纯出,居然都是意外死亡蚯妇,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,448評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門潦刃,熙熙樓的掌柜王于貴愁眉苦臉地迎上來侮措,“玉大人,你說我怎么就攤上這事乖杠》衷” “怎么了?”我有些...
    開封第一講書人閱讀 162,823評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵胧洒,是天一觀的道長(zhǎng)畏吓。 經(jīng)常有香客問我,道長(zhǎng)卫漫,這世上最難降的妖魔是什么菲饼? 我笑而不...
    開封第一講書人閱讀 58,204評(píng)論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮列赎,結(jié)果婚禮上宏悦,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好饼煞,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,228評(píng)論 6 388
  • 文/花漫 我一把揭開白布源葫。 她就那樣靜靜地躺著,像睡著了一般砖瞧。 火紅的嫁衣襯著肌膚如雪息堂。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,190評(píng)論 1 299
  • 那天块促,我揣著相機(jī)與錄音荣堰,去河邊找鬼。 笑死竭翠,一個(gè)胖子當(dāng)著我的面吹牛振坚,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播逃片,決...
    沈念sama閱讀 40,078評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼屡拨,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了褥实?” 一聲冷哼從身側(cè)響起呀狼,我...
    開封第一講書人閱讀 38,923評(píng)論 0 274
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎损离,沒想到半個(gè)月后哥艇,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,334評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡僻澎,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,550評(píng)論 2 333
  • 正文 我和宋清朗相戀三年貌踏,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片窟勃。...
    茶點(diǎn)故事閱讀 39,727評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡祖乳,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出秉氧,到底是詐尸還是另有隱情眷昆,我是刑警寧澤,帶...
    沈念sama閱讀 35,428評(píng)論 5 343
  • 正文 年R本政府宣布汁咏,位于F島的核電站亚斋,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏攘滩。R本人自食惡果不足惜帅刊,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,022評(píng)論 3 326
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望漂问。 院中可真熱鬧赖瞒,春花似錦女揭、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,672評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽勤哗。三九已至抡爹,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間芒划,已是汗流浹背冬竟。 一陣腳步聲響...
    開封第一講書人閱讀 32,826評(píng)論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留民逼,地道東北人泵殴。 一個(gè)月前我還...
    沈念sama閱讀 47,734評(píng)論 2 368
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像拼苍,于是被迫代替她去往敵國和親笑诅。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,619評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容