
由于做大數(shù)據(jù)開發(fā),使用最多的語言就是scala和python,java。 剛開始由于spark是scala開發(fā)的,就去學(xué)習(xí)了scala,然后看spark的源碼。 后面就是基于spark-core寫原生scala的應(yīng)用??傮w來時(shí), scala使用是真的絲滑和順手。尤其函數(shù)式編程。我開發(fā)flink也是使用scala。目前很少使用Java了。
我下面就系統(tǒng)介紹一下,scala的內(nèi)容學(xué)習(xí), 我自己也做一個(gè)系統(tǒng)的學(xué)習(xí)補(bǔ)充吧。
這篇主要從scala入門介紹。
scala官網(wǎng): https://www.scala-lang.org/
Scala combines object-oriented and functional programming in one concise, high-level language. Scala's static types help avoid bugs in complex applications, and its JVM and JavaScript runtimes let you build high-performance systems with easy access to huge ecosystems of libraries.

scala誕生
創(chuàng)始人馬丁·奧德斯基(Martin Odersky)是編譯器及編程的狂熱愛好者,長時(shí)間的編程之后,希望發(fā)明一種語言,能夠讓寫程序這樣的基礎(chǔ)工作變得高效,簡單。所以當(dāng)接觸到JAVA語言后,對(duì)JAVA這門便攜式,運(yùn)行在網(wǎng)絡(luò),且存在垃圾回收的語言產(chǎn)生了極大的興趣,所以決定將函數(shù)式編程語言的特點(diǎn)融合到JAVA中,由此發(fā)明了兩種語言(Pizza & Scala)
與java的關(guān)系
它運(yùn)行在Java虛擬機(jī)(JavaVirtualMachine)之上,輕松實(shí)現(xiàn)和豐富的Java類庫互聯(lián)互通。scala和java程序都是編譯成.class文件,然后在jvm上運(yùn)行。
所以,如果沒有java基礎(chǔ),還是建議先學(xué)java基礎(chǔ)。 scala很多實(shí)現(xiàn)機(jī)制都是在java基礎(chǔ)上實(shí)現(xiàn)的。比如,伴生對(duì)象,成員變量,靜態(tài)方法等, 這些都要反編譯 .class文件去看編譯的java代碼的。
scala語言特點(diǎn)
- Scala是一門以java虛擬機(jī)(JVM)為運(yùn)行環(huán)境并將面向?qū)ο蠛秃瘮?shù)式編程的最佳特性結(jié)合在一起的靜態(tài)類型編程語言。
- Scala 是一門多范式 (multi-paradigm) 的編程語言,Scala支持面向?qū)ο蠛秃瘮?shù)式編程
- Scala源代碼(.scala)會(huì)被編譯成Java字節(jié)碼(.class),然后運(yùn)行于JVM之上,并可以調(diào)用現(xiàn)有的Java類庫,實(shí)現(xiàn)兩種語言的無縫對(duì)接。[案例演示]
- scala單作為一門語言來看, 非常的簡潔高效 (三元運(yùn)算, ++ , --,map,reduce等)
- Scala 在設(shè)計(jì)時(shí),馬丁·奧德斯基 是參考了Java的設(shè)計(jì)思想,可以說Scala是源于java,同時(shí)馬丁·奧德斯基 也加入了自己的思想,將函數(shù)式編程語言的特點(diǎn)融合到JAVA中, 因此,對(duì)于學(xué)習(xí)過Java的同學(xué),只要在學(xué)習(xí)Scala的過程中,搞清楚Scala 和 java相同點(diǎn)和不同點(diǎn),就可以快速的掌握Scala這門語言
- scala像python一樣,一切皆對(duì)象。函數(shù)也是一等公民。(后面會(huì)介紹如何實(shí)現(xiàn)一切皆對(duì)象的)
注意: 這里介紹了函數(shù)式編程概念, 大家下去可以了解一下 命令式編程和函數(shù)式編程的概念和不同。
scala安裝 以及 idea集成環(huán)境配置

scala的安裝方式有很多種, 大家注意版本,比如做spark開發(fā),以及一些apache的軟件都有scala版本的要求。 注意版本匹配。
mac:
brew update
brew install scala
另一種就是下載 二進(jìn)制包 直接安裝
具體安裝以及idea配置,就不說了。我認(rèn)為你會(huì)的。
REPL環(huán)境使用

示例代碼
spark代碼
object Wd {
def main(args: Array[String]): Unit = {
// 配置, 運(yùn)行環(huán)境
val sparkConf: SparkConf = new SparkConf().setMaster("local[*]").setAppName("WordCount")
// 上下文對(duì)象
val sc = new SparkContext(sparkConf)
// 讀取文件,將文件內(nèi)容一行一行的讀取出來
// 如果從本地中使用 file://
val lines: RDD[String] = sc.textFile("file://Users/youdi/Project/javaProject/sparkOne/input")
val words: RDD[String] = lines.flatMap(_.split(" "))
val wordToOne: RDD[(String, Int)] = words.map((_, 1)) // tuple 2
// 分組聚合
val wordSum: RDD[(String, Int)] = wordToOne.reduceByKey(_ + _)
val array: Array[(String, Int)] = wordSum.collect()
array.foreach(println)
}
}
flink代碼:
package org.youdi.wc
import org.apache.flink.api.java.utils.ParameterTool
import org.apache.flink.streaming.api.scala._
object StreamWordCount {
def main(args: Array[String]): Unit = {
val parameters: ParameterTool = ParameterTool.fromArgs(args)
val host: String = parameters.get("host")
val port: Int = parameters.getInt("port")
val env: StreamExecutionEnvironment = StreamExecutionEnvironment.getExecutionEnvironment
// env.disableOperatorChaining()
// 接收socket數(shù)據(jù)流
val textDataStream: DataStream[String] = env.socketTextStream("localhost", 7777)
val wordCountStream: DataStream[(String, Int)] = textDataStream.flatMap(_.split(" "))
.filter(_.nonEmpty).disableChaining()
.map((_, 1)).startNewChain()
.keyBy(0)
.sum(1)
wordCountStream.print().setParallelism(1)
// 打印輸出
env.execute("stream word count job")
// 6> (youdi,1) 線程數(shù)據(jù)
//1> (nihao,1)
}
}