大資料學習,Scala快速學習的方法
大資料學習過程中,都會學習Scala,眾所周知,Spark支援4門語言,分別為R、Python、Java與Scala,但真正的底層實現語言則是Scala。在我以往的實踐分享中,除了Python,我還會利用Scala去實踐一遍,而且在面對大規模的資料建模中,我都會推薦去使用Hadoop、Spark去工程開發,充分利用叢集的計算資源。很多在科多大資料培訓的在讀學員,經常對於學習方法比較提出一文,本文讓大家快速瞭解Scala,並且學會如何學習和使用Scala
一、哪些人群適合學習Scala?
你必須要有清晰的職業發展規劃,而不是追逐著潮流去亂學一通,要學以致用,而不是學非所用!
因此,如果你定位是成
如果你定位是成為一名 ETL工程師、資料探勘工程師 的話,你需要去了解,更要往實踐應用去學習!
除此之外,我並不建議你花心思去折騰它,畢竟你工作場景中也使用不到。
二、哪個階段適合學習Scala?
我並不支援一上來就直接去學習它,因為不積跬步無以至千里,我更希望你有一定Python或者java的基礎,再瞭解一些Hadoop/Spark的應用,才能更好,更快去上手,而不是陷入一種困惑:”我學它到底有什麼用?”。
對於學習順序,建議java-hadoop-hive-hbase-flume-kafka-storm-scala-spark
三、使用Scala有什麼優勢?
學習它並不是讓你在面試時候能夠裝一裝,因為如果只懂皮毛,反而是弄巧成拙,那就不好了。
學習它的初衷,是因為實際工作場景中有需要,平臺叢集環境所決定,用合適的工具做正確的事,僅此而已。
就我目前的體驗來看,它肯定比Python、R這類語言更適合大規模資料的工程開發,更符合線上挖掘業務的生產使用。它也比MapReduce、Java這類語言更簡潔,更高效去開發,而且能提高計算效率。
當然,技術不侷限於只固定使用一種語言,而是從業務和環境角度,靈活選擇合適的語言去開發,讓技術服務於業務。
四、如何能學習上Scala?
可以選擇購買一些相關書
五、哪些知識需要掌握?
除了參考網絡的學習資料外,這裡分享一些必要的基礎知識介紹,便於你聚焦學習方向。
① 語言的背景(瞭解)
scala是一門以java虛擬機(JVM)為目標執行環境並將面向對象和函式式編程的最佳特性結合在一起的靜態類型編程語言。
scala是純粹的面向對象的語言。java雖然是面向物件的語言,但是它不是純粹的,因為java的基本資料類型不是類,並且在java中還有靜態成員變量和靜態方法。相反,scala是純粹面向對象的,每個值都是對象,每個操作都是方法調用。
scala也是一個成熟的函式式語言。函式式編程有兩個指導思想:
a. 函式是頭等值,也就是說函式也是值,並且和其他類型(如整數、字串等)處於同一地位,函式可以被當作引數傳遞,也可以被當作返回值返回,還可以在函式中定義函式等等;
b. 程式的操作應該把輸入值對映為輸出值而不是就地修改,也就是說函式調用不應產生副作用,雖然函式式編程語言鼓勵使用“無副作用”的方法,但是scala並不強制你必須這麼做。
scala允許你使用指令式的編程風格,但是隨著你對scala的深入瞭解,你可能會更傾向於一種更為函式式的編程風格。向函式式編程轉變,你就應該儘量去使用val、不可變對象、無副作用方法,而不是var、可變對象、有副作用方法。要明白的是,從指令式編程向函式式編程的轉變會很困難,因此你要做好充分的準備,並不斷的努力。
scala運行於JVM之上,並且它可以訪問任何的java類庫並且與java框架進行互操作,scala也大量重用了java型別和類庫。
② 使用IDE實現Hello Scala(實踐)
除了Scala解釋器外,我更常用IDE去開發,比如利用已部署好的環境,開發一個Demo程式。
object Demo {
def main(args: Array[String]) {
println("Hello Scala.")
}
}
其中,有幾個寫法的注意事項,需要你去了解的,具體如下所示:
01. 在scala中,語句之後的“;”是可選的。當有多個語句在同一行時,必須加上分號,但不建議把多個語句放在一行。
02. 建議使用2個空格作為代碼縮排,常規的朋友會傾向於一個Tab鍵。
03. Scala的索引也是從0開始的,但是元祖從1開始。
04. 不管是Import方法,還是匹配,使用 _ 相當於Java中的 * 作用。
③ Scala的資料類型(常用)
它有7種數值類型:Byte、Char、Short、Int、Long、Float和Double,以及2種非數值類型:Boolean和Unit(只有一個值“()”,相當於java和c++中的void,即空值)。
這些型別都是抽象的final類(不能使用new新建,也不能被繼承),在scala包中定義,是對java基本資料類型的包裝,因此與java基本資料類型有相同的長度。
另外,scala沿用了java.lang包中的String。在scala中,常量也稱作字面量,字串字面量由雙引號包含的字元組成,同時scala提供了另一種定義字串常量的語法——原始字串,它以三個雙引號作為開始和結束,字串內部可以包含無論何種任意字元。
在scala中,我們使用方法,而不是強制類型轉換,來做數值類型之間的轉換,如99.44.toInt、97.toChar。
④ Scala的變量類型(常用)
它有兩種變量:val和var。val如同java中的final變數,var如同java中的非final變數。
由於scala是完全面向對象的,因此val和var只是聲明瞭對象的引用是不可變的還是可變的,並不能說明引用指向的對象的可變性。
宣告變量的同時需要初始化之,否則該變量就是抽象的。如果不指定變量的類型,編譯器會從初始化它的表示式中推斷出其類型。
當然你也可以在必要的時候指定其類型,但注意,在scala中變量或函式的類型總是寫在變量或函式的名稱的後邊。
val str : String = “Hello Scala.”
⑤ Scala的控制結構(常用)
它與其他編程語言有一個根本性差異,也就是幾乎所有構造出來的語法結構都有值,從而使得程式結構更加精簡。
它內建的控制結構很少,僅有if、while、for、try、match和函式調用等而已,所以熟悉這幾類就足夠了。如此之少的理由是,scala從語法層面上支援函式字面量。
另外,scala中沒有break和continue語句,如果有需要類似功能,可以間接性去實現,如使用Boolean的控制變量、巢狀函式等。
⑥ Scala的函式定義(常用)
定義函式時,除了遞迴函式之外,可以省略返回值類型宣告,它會根據=號後邊的表示式的類型推斷返回值類型,同時=號後邊表示式的值就是函式的返回值,你無需使用return語句。
因為它推薦你使用表示式值代替return返回值,當然根據需要,也可以顯式使用return返回值。
def getNowDate():String={
var now:Date = new Date()
var dateFormat:SimpleDateFormat = new SimpleDateFormat("yyyy-MM-dd")
var todatTime = dateFormat.format(now)
todatTime
}
以上函式的意思是為了獲取當前日期,如今天2018-10-19。而對於遞迴函式必須指定返回值類型,如下斐波拉契數列所示:
def fac(n: Int) : Int = if(n <= 0 ) 1 else n * fac(n-1)
最後,如果沒有函式值返回,則默認返回值是Unit。
⑦ Scala的異常處理(常用)
它與java的類似,但也有區別,如它不需要提前宣告函式、方法可能會丟擲的某種異常。而且throw、try-catch-finally表示式都是有值的,當沒拋異常時,try處為表示式的值;當拋異常被捕獲時,catch處為表示式的值;當拋異常沒被捕獲時,就沒有返回值;finally處計算得到表示式值,不過它常用於處理 關閉檔案、連接 等。
也就是說,如果你想快速入門Scala這麼語言,能夠去實踐開發一些小模型,資料處理邏輯,等等。那上面這7點知識,基本囊括了你短期學習的方向,而更深入的知識點,可以在後期查缺補漏,結合實際場景去調研,去學習,去使用。
更多學習資料,可以給我留言
六、學好Scala的核心關鍵?
這也是學習任何一門語言,甚至是手藝的通用方法,這裡很簡化去概括,更多細節需要慢慢去體會。
第一點:必要的基礎打扎實;
第二點:多尋找開發場景去實踐,目的是為了練手、遇到新問題、鍛鍊解決問題的能力;
第三點:遇到開發困難,先理清瓶頸在哪裡?再多搜尋網絡資料針對性去解決;
第四點:完整去開發一個全流程的資料項目,甚至是業務場景模型,把零散知識貫穿起來;
道理可能大家都懂,但是方法一定要選擇正確,才能事半功倍。