由于做大数据开发,使用最多的语言就是scala和python,java。 刚开始由于spark是scala开发的,就去学习了scala,然后看spark的源码。 后面就是基于spark-core写原生scala的应用。总体来时, scala使用是真的丝滑和顺手。尤其函数式编程。我开发flink也是使用scala。目前很少使用Java了。
我下面就系统介绍一下,scala的内容学习, 我自己也做一个系统的学习补充吧。
这篇主要从scala入门介绍。
scala官网: 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诞生
创始人马丁·奥德斯基(Martin Odersky)是编译器及编程的狂热爱好者,长时间的编程之后,希望发明一种语言,能够让写程序这样的基础工作变得高效,简单。所以当接触到JAVA语言后,对JAVA这门便携式,运行在网络,且存在垃圾回收的语言产生了极大的兴趣,所以决定将函数式编程语言的特点融合到JAVA中,由此发明了两种语言(Pizza & Scala)
与java的关系
它运行在Java虚拟机(JavaVirtualMachine)之上,轻松实现和丰富的Java类库互联互通。scala和java程序都是编译成.class文件,然后在jvm上运行。
所以,如果没有java基础,还是建议先学java基础。 scala很多实现机制都是在java基础上实现的。比如,伴生对象,成员变量,静态方法等, 这些都要反编译 .class文件去看编译的java代码的。
scala语言特点
- Scala是一门以java虚拟机(JVM)为运行环境并将面向对象和函数式编程的最佳特性结合在一起的静态类型编程语言。
- Scala 是一门多范式 (multi-paradigm) 的编程语言,Scala支持面向对象和函数式编程
- Scala源代码(.scala)会被编译成Java字节码(.class),然后运行于JVM之上,并可以调用现有的Java类库,实现两种语言的无缝对接。[案例演示]
- scala单作为一门语言来看, 非常的简洁高效 (三元运算, ++ , --,map,reduce等)
- Scala 在设计时,马丁·奥德斯基 是参考了Java的设计思想,可以说Scala是源于java,同时马丁·奥德斯基 也加入了自己的思想,将函数式编程语言的特点融合到JAVA中, 因此,对于学习过Java的同学,只要在学习Scala的过程中,搞清楚Scala 和 java相同点和不同点,就可以快速的掌握Scala这门语言
- scala像python一样,一切皆对象。函数也是一等公民。(后面会介绍如何实现一切皆对象的)
注意: 这里介绍了函数式编程概念, 大家下去可以了解一下 命令式编程和函数式编程的概念和不同。
scala安装 以及 idea集成环境配置
scala的安装方式有很多种, 大家注意版本,比如做spark开发,以及一些apache的软件都有scala版本的要求。 注意版本匹配。
mac:
brew update
brew install scala
另一种就是下载 二进制包 直接安装
具体安装以及idea配置,就不说了。我认为你会的。
REPL环境使用
示例代码
spark代码
object Wd {
def main(args: Array[String]): Unit = {
// 配置, 运行环境
val sparkConf: SparkConf = new SparkConf().setMaster("local[*]").setAppName("WordCount")
// 上下文对象
val sc = new SparkContext(sparkConf)
// 读取文件,将文件内容一行一行的读取出来
// 如果从本地中使用 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数据流
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) 线程数据
//1> (nihao,1)
}
}
网友评论