章節(jié)概要
Spark是專為大規(guī)模數(shù)據(jù)處理而設(shè)計(jì)的快速通用的計(jì)算引擎,它是由Scala語言開發(fā)實(shí)現(xiàn)的,關(guān)于大數(shù)據(jù)技術(shù),本身就是計(jì)算數(shù)據(jù),而Scala既有面向?qū)ο蠼M織項(xiàng)目工程的能力,又具備計(jì)算數(shù)據(jù)的功能,同時(shí)Spark和Scala的緊密集成,本書將采用Scala語言開發(fā)Spark程序,所以學(xué)好Scala將有助于我們更好的掌握Spark框架。
1.2 Scala的基礎(chǔ)語法
1.2.1 聲明值和變量
Scala有兩種類型的變量,一種是使用關(guān)鍵字var聲明的變量,值是可變的;另一種是使用關(guān)鍵字val聲明的變量,也叫常量,值是不可變的。
- 使用關(guān)鍵字var聲明的變量
var myVar:String="Hello"
- 使用關(guān)鍵字val聲明的變量
val age:Int=10
有以下幾個(gè)事項(xiàng)需要注意:
- Scala中的變量在聲明時(shí)必須進(jìn)行初始化。
- 使用var聲明的變量可以在初始化后再次對變量進(jìn)行賦值;
- 使用val聲明的常量的值不可被再次賦值。
聲明變量時(shí),我們可以不給出變量的類型,因?yàn)樵诔跏蓟臅r(shí)候,Scala的類型推斷機(jī)制能夠根據(jù)變量的初始化的值自動(dòng)推算出來。
上述聲明變量myVar和age的代碼,等同于下列代碼:
var myVar = "Hello" //使用關(guān)鍵字var聲明的變量
val age = 10 //使用關(guān)鍵字val聲明的變量
注:使用關(guān)鍵字var或val聲明變量時(shí),后面緊跟的變量名稱不能和Scala中的保留字重名,而且變量名可以以字母或下劃線開頭,且變量名是嚴(yán)格區(qū)分大小寫的。
1.2.2 數(shù)據(jù)類型
- 任何一種編程語言都有特定的數(shù)據(jù)類型,Scala也不例外。
- 與其他語言相比,Scala中的所有值都有一個(gè)類型,包括數(shù)值和函數(shù)。
Scala中數(shù)據(jù)類型的層次結(jié)構(gòu)
從上圖中可以看出,Any是所有類型的超類型,也稱為頂級(jí)類型,它包含兩個(gè)直接子類,具體如下:
-
AnyVal:表示值類型,值類型描述的數(shù)據(jù)是一個(gè)不為空的值,而不是一個(gè)對象。它預(yù)定義了9種類型,分別是Double、Float、Long、Int、Short、Byte、Unit、Char和Boolean。其中,Unit是一種不代表任何意義的值類型,它的作用類似Java中void。
-
AnyRef:表示引用類型??梢哉J(rèn)為,除值以外,所有類型都繼承自AnyRef。
在Scala數(shù)據(jù)類型層級(jí)結(jié)構(gòu)底部,還有兩個(gè)數(shù)據(jù)類型,分別是Nothing和Null,具體介紹如下:
- Nothing:所有類型的的子類型,也稱為底部類型。它覺的用途是發(fā)出終止信號(hào),例如拋出異常、程序退出或無限循環(huán)。
- Null:所有引用類型的子類型,它主要用途是與其他JVM語言互操作,幾乎不在Scala代碼中使用。
1.2.3 算術(shù)和操作符重載
Scala中算術(shù)操作符(+、-、*、/、%)的作用和Java是一樣的,位操作符(&、|、>>、<<)也是一樣的。特別強(qiáng)調(diào)的是,Scala的這些操作符其實(shí)是方法。例如,a+b其實(shí)是a.+(b)的簡寫。
注:Scala沒有提供操作符++和–。如果我們想實(shí)現(xiàn)遞增或者遞減的效果,可以使用“+=1”或者“-=1”這種方式來實(shí)現(xiàn)。
1.2.4 控制結(jié)構(gòu)語句
在Scala中,控制結(jié)構(gòu)語句包括條件分支語句和循環(huán)語句。其中,條件分支語句有if語句、if…else語句、if…else if…else語句以及if…else嵌套語句;循環(huán)語句有for循環(huán),while循環(huán)和do…while循環(huán)。
- 條件分支語句
- if條件語句
if (布爾表達(dá)式){
語句塊
}
- if-else條件語句
if (布爾表達(dá)式){
語句塊
} else{
語句塊
}
- if-else-if-else語句
if (布爾表達(dá)式1){
語句塊
} else if(布爾表達(dá)式2){
語句塊
} else if(布爾表達(dá)式3){
語句塊
} else {
語句塊
}
- if-else嵌套語句
if (布爾表達(dá)式1){
語句塊
if(布爾表達(dá)式2){
語句塊
}
}else if (布爾表達(dá)式3){
語句塊
else if (布爾表達(dá)式4){
語句塊
}
}else{
語句塊
}
示例代碼如下:
2. 循環(huán)語句
Scala中的for語句和Java中的循環(huán)語句在語法上有較大的區(qū)別,下面我們來介紹一下Scala中的for循環(huán)語句。
- for循環(huán)語句
for(變量<-表達(dá)式/數(shù)組/集合){
循環(huán)語句;
}
下面,我們通過從0循環(huán)到9,每循環(huán)一次則就將該值打印輸出進(jìn)行操作演示。在Scala語法中,可以使用”0 to 9”表示從0到9的范圍,范圍包含9,示例代碼如下:
-
Dos 命令行下
-
IDEA下
結(jié)果如下:0 1 2 3 4 5 6 7 8 9
Scala在for循環(huán)語句中可以通過使用if判斷語句過濾一些元素,多個(gè)過濾條件用分號(hào)分隔開。例如,輸出0-9范圍中大于5的偶數(shù),示例代碼如下:
-
while循環(huán)語句
Scala中的while循環(huán)語句和Java中的完全一樣,語法格式如下: -
while語句
while(布爾表達(dá)式){
循環(huán)語句;
}
下面,我們通過打印輸出奇數(shù)的案例來演示while的使用。
假設(shè)有一個(gè)變量x=1,判斷是否小于10,如果是則打印輸出,然后再進(jìn)行+2運(yùn)算。
示例代碼如下:
- do-while語句
do{
循環(huán)語句;
}while(布爾表達(dá)式)
do…while循環(huán)語句與while語句的主要區(qū)別是,do…while語句的循環(huán)語句至少執(zhí)行一次,示例代碼如下:
1.2.5 方法和函數(shù)
在Scala中,它和Java一樣也是擁有方法和函數(shù)。Scala的方法是類的一部分,而函數(shù)是一個(gè)對象可以賦值給一個(gè)變量。換句話來說,在類中定義的函數(shù)即是方法。
Scala中可以使用def語句和val語句定義函數(shù),而定義方法只能使用def語句。下面分別對Scala的方法和函數(shù)進(jìn)行講解。
- 方法
Scala方法的定義格式如下:
def functionName ([參數(shù)列表]):[return type]={
function body
return [expr]
}
下面定義一個(gè)方法add,實(shí)現(xiàn)兩個(gè)數(shù)相加求和,示例代碼下:
def add(a:Int,b:Int):Int={
var sum:Int = 0
sum = a + b
return sum
}
Scala的方法調(diào)用的格式如下:
//沒有使用實(shí)例的對象調(diào)用格式
functionName(參數(shù)列表)
//方法使用實(shí)例的對象來調(diào)用,我們可以使用類似Java的格式(“.”號(hào))
[instance.]functionName(參數(shù)列表)
下面,在類Test中,定義一個(gè)方法addInt,實(shí)現(xiàn)兩個(gè)整數(shù)相加求和。在這里, 我們通過“類名.方法名(參數(shù)列表)”來進(jìn)行調(diào)用,示例代碼如下:
scala> :paste # 多行輸入模式的命令
// Entering paste mode (ctrl-D to finish)
object Test{
def addInt(a:Int,b:Int):Int={
var sum:Int =0
sum = a + b
return sum
}
}
// Exiting paste mode, now interpreting. # Ctrl+d結(jié)束多行輸入模式
defined object Test
scala> Test.addInt(4,5) # 方法調(diào)用
res0: Int = 9
- 函數(shù)
Scala中的函數(shù)是一個(gè)對象,可以賦值給一個(gè)變量。
Scala函數(shù)的定義語法格式如下:
val functionName ([參數(shù)列表]):[return type]={
function body
return [expr]
}
下面,定義一個(gè)函數(shù)addInt,實(shí)現(xiàn)實(shí)現(xiàn)兩個(gè)整數(shù)相加求和,示例代碼如下:
scala> val addInt =(a:Int,b:Int) => a+b
addInt: (Int, Int) => Int = <function2>
scala> addInt(6,7)
res1: Int = 13
- 方法轉(zhuǎn)換成函數(shù)
方法轉(zhuǎn)換成函數(shù)的格式如下:
val f1 = m _
在上述的格式中,方法名m后面緊跟一個(gè)空格和下劃線,是為告知編譯器將方法轉(zhuǎn)換成函數(shù),而不是要調(diào)用這個(gè)方法。下面,定義一個(gè)方法m,實(shí)現(xiàn)將方法m轉(zhuǎn)成函數(shù),示例代碼如下:
scala> def m(x:Int,y:Int):Int=x*y # 方法
m: (x: Int, y: Int)Int
scala> val f = m _
f: (Int, Int) => Int = <function2> # 函數(shù)
scala> f(2,3)
res2: Int = 6
注:Scala方法的返回值類型可以不寫,編譯器可以自動(dòng)推斷出來,但是對于遞歸方法來說,必須要指定返回類型。文章來源:http://www.zghlxwxcb.cn/news/detail-679519.html
轉(zhuǎn)載自:https://blog.csdn.net/u014727709/article/details/132031799
歡迎start,歡迎評(píng)論,歡迎指正文章來源地址http://www.zghlxwxcb.cn/news/detail-679519.html
到了這里,關(guān)于Spark大數(shù)據(jù)分析與實(shí)戰(zhàn)筆記(第一章 Scala語言基礎(chǔ)-2)的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!