1. 程式人生 > >Spark之Scala學習之路(一)

Spark之Scala學習之路(一)

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。

對Scala語法的基本操作:

Scala>2*3.5
Res0:Double=7.0 //可以自動得知型別
Res0.to //按Tab鍵可以出現提示
val age1,age2,age3=0 //1行多個變數申明,val是不可變變數
var age=0                     //var是可變變數
age=1  //重新賦值

0.to(5)   //To方法   結果為一個數據集合Range<0,1,2,3,4,5> 

min(20,4)    //函式的呼叫 求一個最小值

printf("%s is the future's Framwork ","Spark")  //輸出
readLine            //讀入
readLine(“ xxx”)
readInt

If 語句:

 val age=19
 val buffered=0
 if (age>18) "adult" else "child"
 val result=if (age>10){
   "adult"
    buffered=10
    buffered  //最後一行的值是整個程式碼塊的返回值
}

迴圈語句:

val element=10
for (i <- 0 to element if (i%3==0)) printf("%d",i) //新增判斷語句,是元素的判斷
for (i <- 0 to element) printf("%d",i)
Break用 法:      //需要匯入 scala.util.control.Breaks
   for (i <- 0 to 10){
      if (i==4) break
    println(i)
   }

函式定義:

val n=10
 def f1:Any={        //Any型別是因為返回的型別無法確定
   for (i<- 0 to 20){
     if (i==n) return 10
     println(i)
   }
 }  
 def f3(param1:String,param2:Int=20)=param1+param2
 f3("Spark")                    //函式呼叫
 f3(param2=100,param1="Scala")  //可以改變引數順序
 def sum(number:Int*)={       //求和,元素個數任意               
 sum(1,2,3,4,6)
 sum(1 to 100:_*)   //-*把每個元素都提取出來
 var result=0;
   for (element<-number) result +=element
   result
 }
 def morming(content:String) { }
def morming1(content:String):Unit=" " //過程,沒有返回值

lazy:如果一個變數宣告為lazy,表示這個變數只有在第一次使用時,才會發生計算,比如說開啟檔案,開啟資料庫,操作網路,如果將變數宣告為lazy,特別有用。

 lazy val content=fromFile("test.txt")   //匯入 scala.io.Source._

異常: //匯入 java.io.FileNotFoundException

 try{
   val content=fromFile("...").mkString
 }catch {
   case _:FileNotFoundException => println("can not find")
 }finally {
   println("Bye!!")
 }

陣列:

 val arr=new Array[Int](5)    //新建陣列包含5個元素
        arr(3)=4                       //改變第3個元素
 import scala.collection.mutable.ArrayBuffer
 val arrBuffer=ArrayBuffer[Int]()  //大小可以變的陣列
 arrBuffer+=10                     //新增元素
 arrBuffer++=Array(1,4,3,4)  
 arrBuffer.trimEnd(3)              //截掉後面3個元素
 arrBuffer.insert(5,2,3)           //在第5個元素後加入2,3
 arrBuffer.remove(6,3)             //從第6個元素開始移除3個
 val arr2=arrBuffer.toArray        
 arr2.toBuffer
 for (elem <- arr2) println(elem)
 for (i<-0 until(arr2.length,2)) println(arr(i))  //間隔輸出
 for (i<- (0 until arr2.length).reverse) println(arr(i))
 arr2.sum  //逆序輸出
 scala.util.Sorting.quickSort<arrBuffer>
 val arr3=for (i<-arr if (i%2==0)) yield  i*i
 arr.filter(_%3==0).map(i=>i*i)

Map:

  val person=Map("spark"->6,"hadoop"->11)
  val persons=scala.collection.mutable.Map("spark"->6,"hadoop"->11)
  persons += ("Filnk"->5)    //新增
  persons -= "Flink"         //刪除
 for ((key,value)<-person) println(key+":"+value)
 val person=scala.collection.immutable.SortedMap("spark"->6,"hadoop"->11)        //對Map排序
 val tuple("spark",6,99.9)   //元組 包含各種型別
 tuple._1                    //spark

task1:移除一個數組中第一個負數後的所有負數
思想:先找到第一個負數,進行標記,然後對後面出現的每一個負數進行計數,並統計後面負數出現的總數,每一個非負數移動負數個位數,這樣末尾刪除負數的統計總數,剩下就是滿足題意的

     val arr=Array(1,34,-6,23,-1,24,-12,-23,23,45,-4,-34,-36,19)
      var bool,num,tol=0
       for (i <- 0 until(arr.length,1)){
       if (bool==0 && arr(i)< 0) bool=1
       else if (bool==1){
         if (arr(i) < 0){
           num+=1
           tol+=1
         }else arr(i-num)=arr(i)
       }
      }
     val arr2=arr.toBuffer
     arr2.remove(arr.length-tol,tol)
     arr2.mkString(",")