大數(shù)據(jù)公開課 - Scala基礎(chǔ)課件_第1頁(yè)
大數(shù)據(jù)公開課 - Scala基礎(chǔ)課件_第2頁(yè)
大數(shù)據(jù)公開課 - Scala基礎(chǔ)課件_第3頁(yè)
大數(shù)據(jù)公開課 - Scala基礎(chǔ)課件_第4頁(yè)
大數(shù)據(jù)公開課 - Scala基礎(chǔ)課件_第5頁(yè)
已閱讀5頁(yè),還剩62頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

大數(shù)據(jù)公開課-Scala基礎(chǔ)什么是Scala 一門可伸縮的語(yǔ)與Java無(wú)縫結(jié)合簡(jiǎn)單有趣面向?qū)ο蠛瘮?shù)式函數(shù)即對(duì)象編程環(huán)境scalashelleclipseintellijidea一門可伸縮的語(yǔ)言即可作為腳本語(yǔ)言也可以作為企業(yè)應(yīng)用例如腳本hello.sh內(nèi)容如下:可以執(zhí)行:與java無(wú)縫結(jié)合scala代碼最終被編譯為class(java字節(jié)碼),加載至java虛擬機(jī)運(yùn)行也就是說(shuō),scala的類可以被java所使用,反之亦然研究scala時(shí),可以利用一些反編譯工具,查看scala編譯器生成的字節(jié)碼語(yǔ)法基礎(chǔ)變量vara=10常量valb=100表達(dá)式1+100if(a>0)"ok"else"notok"語(yǔ)法基礎(chǔ)方法定義def方法名(參數(shù):類型):返回類型={表達(dá)式;表達(dá)式}例如:注意:如果只有一個(gè)表達(dá)式,那么{}可以省略方法中最后一個(gè)表達(dá)式作為該方法的返回值定義函數(shù)時(shí),如果根據(jù)表達(dá)式能夠確定返回值類型,那么不需要聲明它基本語(yǔ)法常用類型String消除轉(zhuǎn)義StringContextInt,Long,Double...Range,TupleList,Set,Mapscala喜歡省略(1)對(duì)象方法沒(méi)有參數(shù)時(shí)scala喜歡省略(2)對(duì)象方法僅有一個(gè)參數(shù)時(shí)比如之前見過(guò)的Range類型1是Int類型有to方法,接收10這個(gè)參數(shù),返回一個(gè)類型為Range的對(duì)象隨意的方法名可以使用!,++,?等有趣的字符作為方法名例:List的方法::::++:這里有一個(gè)約定,最后一個(gè)字符是【:】的方法是右結(jié)合的,即:List(1,2):::List(3,4)=List(3,4).:::(List(1,2))=List(1,2,3,4)1+:List(2,3)=List(2,3).+:(1)=List(1,2,3)面向?qū)ο蟊萰ava更簡(jiǎn)單caseclass的背后(1)caseclass的背后(2)已經(jīng)實(shí)現(xiàn)了很多方法...caseclass適用場(chǎng)景可以用于模式匹配trait應(yīng)該說(shuō)java8里的接口,模仿了scala中的traittrait中不僅可以定義抽象方法,也可以定義方法實(shí)現(xiàn):trait注意:scala中要重寫方法,需要顯式使用override關(guān)鍵字traittrait實(shí)現(xiàn)多繼承的原理:scala喜歡在編譯期做手腳traitPerson的方法內(nèi),實(shí)際調(diào)用的是抽象類中的靜態(tài)方法實(shí)現(xiàn)函數(shù)是一等公民Scala中的匿名函數(shù):(參數(shù):類型)=>{表達(dá)式;表達(dá)式}函數(shù)在Scala中最后會(huì)被解析為一個(gè)對(duì)象,這就意味著,它可以作為參數(shù)或是返回值其他接收函數(shù)作為參數(shù)的方法,或是將函數(shù)作為返回值的方法,稱之為高階函數(shù)(HigherOrderFunctions)函數(shù)怎么變成對(duì)象的下面這個(gè)匿名函數(shù)其實(shí)是一個(gè)對(duì)象varfunc0=(x:Int)=>println("ok")它會(huì)被翻譯成:objectfunc0extendsFunction1[Int,Unit]{defapply(x:Int)=println("ok,"+x);}調(diào)用func0實(shí)際就是調(diào)用了func0對(duì)象的apply方法func0(1)其實(shí)就是func0.apply(1)只是【.apply】被省略了高階函數(shù)先來(lái)看看高階函數(shù)的威力:已存在一個(gè)數(shù)字集合,按照奇偶數(shù)分成兩個(gè)集合,下面是java的實(shí)現(xiàn)高階函數(shù)再看Scala實(shí)現(xiàn):partition就是Scala集合中提供的高階函數(shù),像這樣的高階函數(shù),還有很多幾個(gè)重要的高階函數(shù)map(f:A=>B)將集合中的元素由A類型轉(zhuǎn)換為B類型reduce(op:(A,A)=>A):A將op函數(shù)的運(yùn)算結(jié)果與下一個(gè)元素進(jìn)行運(yùn)算,假設(shè)元素有a,b,c,dop(a,b)op(op(a,b),c)op(op(op(a,b),c),d)groupBy(f:A=>K)將元素按照f(shuō)函數(shù)返回結(jié)果進(jìn)行分組幾個(gè)重要的高階函數(shù)filter(f:A=>Boolean)將集合中的元素按f函數(shù)過(guò)濾,f返回為真時(shí)保留flatMap(f:A=>GenTraversableOnce[B])將集合中的每個(gè)元素轉(zhuǎn)換為一個(gè)seq,最后連接所有的seq至一個(gè)大集合一個(gè)經(jīng)典的例子單機(jī)版的wordcount一個(gè)經(jīng)典的例子單機(jī)版的wordcount現(xiàn)在來(lái)體會(huì)函數(shù)式編程的一個(gè)重要思想程序應(yīng)當(dāng)被分解為多個(gè)小的函數(shù),每個(gè)函數(shù)來(lái)處理一個(gè)特定任務(wù)Scala的學(xué)習(xí)資料《快學(xué)Scala》《ProgramminginScala》提問(wèn)時(shí)間大數(shù)據(jù)公開課-Scala應(yīng)用講師:滿一航Scala技術(shù)棧面向web應(yīng)用面向分布式應(yīng)用面向大數(shù)據(jù)應(yīng)用測(cè)試Web框架Web框架分布式框架大數(shù)據(jù)框架測(cè)試框架我們重點(diǎn)來(lái)看看并發(fā)和分布式的Scala知識(shí)并發(fā)基礎(chǔ)不可變性WordCount變?yōu)椴l(fā)外部排序Actor模型WordCount變?yōu)榉植际讲l(fā)基礎(chǔ)future學(xué)過(guò)java的同學(xué)都很了解Executor和Future對(duì)象了但讓我們來(lái)比較一下scala中來(lái)完成一件長(zhǎng)時(shí)間運(yùn)算的代碼:為什么說(shuō)函數(shù)式編程中不可變(immutable)是重要的對(duì)于一個(gè)函數(shù),只要輸入?yún)?shù)一樣,返回值也應(yīng)當(dāng)一樣不可變對(duì)象可以被安全地在多線程環(huán)境下使用future的使用場(chǎng)景幾個(gè)future串行當(dāng)一個(gè)future需要以另一個(gè)future的結(jié)果作為輸入時(shí)幾個(gè)future并行當(dāng)幾個(gè)future的結(jié)果都要作為計(jì)算輸入時(shí)讓wordCount變成并發(fā)回憶之前的wordCount程序,如果希望讓它變?yōu)椴l(fā)版本,只需要:分析一下reduce操作單線程分析一下reduce操作并行集合外部排序在數(shù)據(jù)量特別大,而內(nèi)存有限的場(chǎng)景下,如何實(shí)現(xiàn)排序操作呢?1G的數(shù)據(jù)量,可用內(nèi)存只有250M思想:分而治之迭代器一條條讀入數(shù)據(jù),把部分?jǐn)?shù)據(jù)進(jìn)行排序=》外部文件1.txt一條條讀入數(shù)據(jù),把部分?jǐn)?shù)據(jù)進(jìn)行排序=》外部文件2.txt...一條條讀入數(shù)據(jù),把部分?jǐn)?shù)據(jù)進(jìn)行排序=》外部文件n.txt將外部文件做一個(gè)歸并運(yùn)算(Merge)分而治之假設(shè)要排序的數(shù)據(jù)總大小為1G如果排序的內(nèi)存只有250M那么可以將數(shù)據(jù)分為4份,每次只對(duì)250M數(shù)據(jù)排序每次排序的結(jié)果輸出到外部文件(稱之為spill)接下來(lái)使用歸并(merge)排序的方式來(lái)達(dá)到目的如何歸并要求將相同的元素combine在一起如果每個(gè)spill中有重復(fù)怎么辦?如果Queue中有重復(fù)怎么辦?只是看起來(lái)很好但在實(shí)際應(yīng)用中,單機(jī)的處理能力有限,因?yàn)閏pu核數(shù)的限制,在線程達(dá)到某一數(shù)目時(shí),并不能進(jìn)一步提高并行率從單機(jī)走向分布式分布式編程相對(duì)而言比較復(fù)雜底層涉及到socket通信、對(duì)象序列化、遠(yuǎn)程調(diào)用等多種技術(shù)scala中有Akka框架幫我們處理這些底層技術(shù),可以讓程序員專注于分布式的業(yè)務(wù)邏輯什么是ActorActor:將通信抽象為消息發(fā)送和接收Actor的特點(diǎn)輕量復(fù)用線程使用Actor帶構(gòu)造參數(shù)的ActorActor發(fā)送消息的兩種模式第一種,前面helloWorld例子使用的模式稱為Tell(Fire-forgot)

它是首選的消息發(fā)送模式,因?yàn)椴恍枰枞却貞?yīng)消息,具有最好的并發(fā)性能第二中,稱為Ask(Send-And-Receive-Future)

不同之處在于它不僅將消息發(fā)送出去,還需要等待對(duì)方的應(yīng)答。由于使用了Future接口,發(fā)送消息并不會(huì)被阻塞Ask模式必須在兩個(gè)Act

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論