第1課 Scala入門與實戰筆記總結


第一課:Scala入門
1:Scala的重大價值
2:Scala基礎函數入門實戰
3:Scala函數入門實戰
4:Scala中的Array,Map,Tuple實戰
5:綜合案例及Spark源碼解析

Scala與Java的關系:
一:它們都是基於JVM的,但Scala可以調用Java的任何功能,比如Spark運行在Hadoop上,它可以調用Hadoop上的一切功能。
二:你可以認為Scala它是一個升級版的Java,因為Scala它本身是一門支持面向對象的語言,在Scala中,一切皆對象,它是一門純面向對象的語言,同時Scala也是面向對象以及函數式結合的語言。


大數據的開發語言是Scala,原因如下:
一:大數據的本身是計算數據,而Scala即有面向對象組織項目工程的能力,又有計算數據的功能。
二:現在大數據事實上的計算標准框架Spark,它是用Scala開發的,因為計算數據,Scala它是函數式編程,它實現算法非常簡潔優雅。
例:kafka,它是一個消息中間件,如果外部數據要流進大數據中心,我們一般都要用kafka作適配器,那如果大數據中心的數據流到外部,也是用kafka(如Spark計算的數據要交給HBASE或MySql,期間我們都會用kafka),很多的大數據組件都是用的Scala編寫的,SO,如果你想成為一個頂級的大數據開發高手,你一定要掌握Scala。

結果類型轉換:
1.5*2 結果res1:Double = 3.0
res1.toInt //按table可以自動補全

Scala中變量的聲明:
一:可變變量的聲明
var name="Spark" //聲明了一個可變變量name,值為Spark,可以將name的值改為Scala:name="Scala"

二:不可變變量的聲明
val result = 2+10 //聲明了一個不可變的變量result且它的值是12,它的值是不可被改變的,如果你重新給result賦值為13,result=13,此時會報錯,因為變量result是不可變變量。

注:Spark RDD中的數據默認都是不可變的。


三:手動指定變量賦值的類型
val age : Int = 0 //指定age不可變變量的類型為Int,值為0
val name : String = null //指定name不可變變量的類型為String,它的默認值是null
注:如果你指定了變量具體的類型,后續對變量賦值時:只能賦值為你指定的類型或者類型的子類型。

四:一行代碼同時聲明多個變量
val age1, age2,age3 = 0

注意:Scala中,它可以完成基本類型和我們所謂的對象類型的自動轉換的操作,在Scala中,基本類型就是對象,比如:10.toLong,在Java中,基本類型是沒有這種方法的,但Scala中就有。

Scala中沒有這種1++,1--,這種操作符。
比如:var age = 10; age ++ //這樣操作是不對的,但是你可以這樣做:age+=1

取最小值:
import scala.math._
min(20,4)
結果為4

構建數組:
val array = Array(1,2,3,4)
內部實現:val array = Array.apply(1,2,3,4)

五:if 表達式
val age = 19
if(age>=18) "adult" else "child"
結果String = adult
//注意:Scala中,if表達式是有結果的,但Java中是沒有的。

****最后一行的值是整個代碼塊的返回值:如下****
var buffered = 0;
val result = if(age>=18){
| "audlt"
| buffered = 10
| buffered
}
//結果result:AnyVal = 10

六:循環
0 to element

for(i <- 0 to element) println(i)

//說明:<- 它是個提取符,提取出這個集合Range中的每一個元素並把它的值賦值給i

for(i <- 0 to element if i%2 ==0) {
println(i)
}
//打印出偶數

如何終止循環,因Scala中沒有break語句,但Scala中有一個Breaks對象,我們可以使用。
一:導包:import scala.util.control.Breaks._
二:使用
for(i <- 1 to 10){
if(i==4)
break
println(i)
}
結果1 2 3
scala.util.control.BreakControl
//其實此時已經實現了return

七:函數定義:
默認參數
def f3(param1:String,param2:Int=30)=param1+param2
f3("Spark")
值:Spark30

不按順序傳參:帶名參數,如下
f3(param2=100,param1="Scala")
結果:Scala100

變長參數函數
def sum(numbers : Int*)={var result=0;for(element <- number) result+=element;result}
sum(1,2,3,4,5,6,7,8,9,10)
值為55

sum(1 to 100:_*) 值為5050,:_*表示將里面的每個元素提取出來,再相加
沒有返回值的函數叫做過程。


八:lazy:如果一個變量聲明為lazy,表示這個變量只有在第一次使用時,才會發生計算,比如說打開文件,打開數據庫,操作網絡,如果將變量聲明為lazy,特別有用。

九:異常
try{

}catch{

}finally{
println("finally")
}

//注意:與Java中的異常稍微不一樣。


十:集合操作
創建不可變數組:val arr = new Array[Int](5) //創建了一個不可變的數組,大小為5,官方說法:val表示arr本身的對象不可修改,但對象的內容是可以修改的
訪問元素:arr(3) //訪問第4個元素。
修改元素的值:arr(2)= 8


創建不可變數組時並賦值:val arr1 = Array("Scala","Spark")
其實它內部用的是apply: val arr1 = Array.apply("Scala","Spark") // apply就是內部工廠方法構造器


創建可變數組:可增加或刪減元素
一:導包 import scala.collection.mutable.ArrayBuffer
二:val arrBuffer = ArrayBuffer[Int]()
追加元素:arrBuffer +=10;
arrBuffer +=(11,1,3,4,5) //那么這個可變數組就有5個元素
arrBuffer ++=(1,2,3,4) //在現有的arrBuffer的5個元素的后面追加1,2,3,4 四個元素

刪減元素:
arrBuffer.trimEnd(3) //截斷arrBuffer后面的3個元素

固定位置加元素:arrBuffer.insert(5,100),第5個元素增加100這個元素,那么后面的元素會往后移
固定位置刪元素:arrBuffer.remove(5),刪除第5個位置的元素
arrBuffer.remove(5,3),第5個位置開始刪除3個元素,包括5的位置

for循環遍歷數組
for(element <- arrBuffer)
{
println(element)
}
數組求和:arrBuffer.sum
數組求最大值:arrBuffer.max
數組排序:scala.util.Sorting.quickSort(arrBuffer)

Map
定義不可變的Map val persons = Map("Spark" ->6,"Hadoop" -> 11)
訪問key為Hadoop的Map里面的值:persons("Hadoop")

定義可變的Map
val persons = scale.collection.mutable.Map("Spark" ->6,"Hadoop" -> 11)
加元素:
persons=+("Flink" -> 5)
減元素:
persons-="Flink"

Map中的if()else()操作的變型
在Spark中寫法是:persons.getOrElse("Spark",1000) //如果persons這個Map中包含有Spark,取出它的值,如果沒有,值就是1000。

for循環訪問persons里面的Key和value
for((key,value)<- persons)
println(key+":"+value)
值:Hadoop:11
Spark:6

創建可排序的Map:會對Map的key進行排序
val persons = scale.collection.immutable.SortedMap("Spark" ->6,"Hadoop" -> 11)

tuple:它可以存放很多的不同類型的數據
val tuple=("Spark",6,99.0)
訪問:tuple._1 結果String=Spark
注:它的訪問下標是從1開始的,跟數組不一樣。

 

開發環境:

  Ubuntu 14.x

  Scala 2.10.4 

  Java 1.8

 

移除一個數組中第一個負數以后的負數

實現方式一:

DT大數據夢工廠大數據門徒3000第一作業答案(包含普通算法實現和高效實現)      

上述第一種實現方式由於在發現第一個負數之后的每一個負數會立即進行移除,性能較差,多次移動數組

實現方式二:

DT大數據夢工廠大數據門徒3000第一作業答案(包含普通算法實現和高效實現)

上述的方式是首先記錄所有不需要移除的元素的索引,最后一次性移除所有需要移除的元素,性能相對較高


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM