温馨提示:最好是用事先准备好的scala插件和scalaSDK,不要在Idea开发工具里下载,因为如果你的网不好的话,会下载的很慢
Ctrl+Alt+s打开设置,搜索plugins按图中提示选择
选择你的scala插件目录
然后新建项目,按图中选择
按图中提示选择你的scalaSDK目录
这样不出意外,一个崭新的scala项目就创建好了。
首先我们要实现在线计算就需要spark和scala,那么spark的底层是scala,其次scala是基于java的。
使用scala开发的优点有很突出的两点:开发效率高和运行速度快。
自从大数据、人工智能、区块链等概念一炒再炒,python无疑成为了最为热门的语言,常年盘踞编程语言前三,与此同时,活跃的社区、便于入门的代码也使得python成为进入人工智能、大数据领域的最佳语言选择,但是笔者在大数据领域的一个最深切感受却是:如果要在大数据、机器学习、深度学习等领域更进一步,有必要去学习一下scala编程,原因如下:
1、scala与java可以无缝链接:尽管笔者不是java出身,但在互联网领域java无疑是最具影响力的语言之一,良好的社区,规范优美的代码规则,都使得java成为近年来互联网应用最为广泛的语言,而scala与java几乎可以称作无缝链接,通过简单的import就可以调用java中各式各样的类和方法,同时,scala完成的算法包也是以jar包的形式出现,同样的语言实现都是经过JVM来实现,这使得scala相比于python就有先天的优势,当你在使用python时,写了一大堆mapper代码就是为了使得训练数据和测试数据能够得到同样处理,以便生成的pmml文件可以在java开发工程师手里上线时,却碰到自定义函数不能被识别的囧境时,你就会发现python仍然是python,pkl文件仍然是pkl文件,但java就在那里,不悲不喜,这个问题对scala用户则是完全不存在的。
2、与spark的天然血缘,众所周知,spark的开发代码就是scala语言,那么用开发语言来运行本身的程序,简直不要太舒服,尽管为了让spark显得更亲民一些,开发了pyspark等API,但这种API仍然像是隔着军大衣在拥抱,pyspark没有GraphX的集成,python跟spark本身的运行模式就是相抵触的,pandas版本的DataFrame与spark版本的DataFrame名字一样,但用法确实完全不一样,体会过几十万数据进行toPandas操作时要死机的崩溃时,就会明白,这也不是一个很有意思的事情,因为spark本身就代表着分布,转成pandas以后就是赤裸裸的本地,哪来的分布式思想。但scala就不同了,天生的分布式理念,从spark对于scala而言,就有点类似于pandas与sklearn对于python而言,只不过一个是分布式,一个是单机版,掌握了scala就能把spark用的风生水起,包括spark用于实时计算的streaming都可以用scala进行一站式操作,说到实时计算,即使是现在火热的Flink也一样可以用scala操作,所以这门语言对于大数据的离线数据操作和实时数据操作都是非常方便的。
3、相比于python,scala的编写更为规范,尤其是那优美的大括号,当你写上几个以后,你就会爱上这种格式,暂时想到的就是这些。
scala 是一门多范式的编程语言,即面向对象也是函数式编程
面向对象:万物皆对象 封装 实例对象 类 继承
函数式编程: 面向过程 函数当成编程
Scala是一门主要以Java虚拟机(JVM)为目标运行环境,并将面向对象和函数式编程有机的结合在一起。因为Scala运行于JVM上,所以Scala可以访问任何Java类库,并且能够与Java框架进行互操作。Scala既有动态语言的灵活简洁(通过类型推到),又有静态类型检查带来的安全保证和执行效率(Scala是静态类型语言)。Scala支持处理脚本化的临时任务,也能处理高并发场景下的分布式互联网大数据应用程序。
相同点:
1.java和scala可以无缝混编,它们都是基于jvm
2.二者可以相互调用
不同点:
1.类型自动推断,并如果写类型化,是写在变量名的后面
2.val var
3.支持函数式编程
4.构造器不一样
5.java中可以自动默认值,scala中必须手动给默认值
6.scala 不需要分号,但是java 必须要有
7.get set 方法自己实现
age:相当于java中的getter方法
age_$eq:相当于java中set方法
8.java中的放回只用return scala 中没有return
main方法讲解
语法
关键字 方法名 (参数):返回值类型={
方法体
}
def main(args: Array[String]): Unit = {
}
1)定义
常量:是在运行的过程中,其值不会发生变化的量 例如:数值3 字母A 修饰的关键字val
变量:是在运行的过程中,其值可以发生变化的量 例如:时间,年龄 修饰的关键字var
2)语法
val name:Type=变量值
var name:Type=变量值
注意1:
类型可以不写,scala 可以自动类型推断
注意2:变量名称必须符合命名规范,不能使用关键字(命名规范和java一样)
1.字母,下划线,数字组成,并且不能以数字开头
val 4_tablename=“t_user”;
2.变量名要做到见名知意,(如果英文不好我们通过通过有道翻译)
3.用驼峰命名法命名多个单词组成的变量名
val tablename=“t_user”;
4.变量名不能使用关键字
val def =12
any是所有类型的超类,也成为顶级类型
anyVal (值类型) :
int short byte long double string char boolean Uint (9个)
长度 4 2 1 8 8 4 2 1
anyRef(引用类型) :
List map option yourclass …
注意:java类型中没有和scala中Nothing对应的类型
1)scala 中使用lazy 关键字修饰变量,就是惰性变量,实现延迟加载
注意:惰性变量只能是常量,并且只有在调用惰性变量时,才会去实例化这个变量
2)案例演示
//正常的
var str = {
println("helloworld")
}
//懒加载
的形式
lazy val str1 = {
println("helloworld")
}
//调用这个变量
str1
3)好处
场景:使用在比较耗时的业务中,如网络IO 磁盘IO
scala中有三种插值器
1.在任何字符串前面加上s,就可直接在字符串中使用变量了
val name:String="cat"
println(s"she is name is ${name}")
2.f插值器:
val height=1.23568
println(f"身高是${height}%.2f")
3.raw插值器:是输入字符串原样,不进行转义
例如:
//没有使用raw
println("a\nb\n\tc")
//使用的效果
println(raw"a\nb\n\tc")
private :一个类的内部可用
protected:自己类 子类也可以被访问(这个比java更加严格,java同一个包的其他类也可以访问)
public ::如果没有指定修饰符 ,这样的成员在任何地方都可以被访问
注意:
如果不指定的情况下,就是public
实例1:(只能自己访问)
class Test01 {
private val name = "毕老师"
def main(args: Array[String]): Unit = {
println(name)
}
}
实例2:
class Test01 {
protected val name = "毕老师"
}
class Test02 extends Test01 {
def main(args: Array[String]): Unit = {
println(name)
}
}
实例3:
object Test {
def main(args: Array[String]): Unit = {
val test0 = new Test01
println(test0.name)
}
}
class Test01 {
val name = "毕老师"
算术运算符:加 减 乘 除 取余
object Test {
def main(args: Array[String]) {
val a = 100
val b = 200
val c = 250
val d = 250
println("a 加 b = " + (a + b))
println("a 减 b = " + (a - b))
println("a 乘 b = " + (a * b))
println("b 除 a = " + (b / a))
println("b 取余 a = " + (b % a))
}
}
关系运算符: == != > < >= <=
object Test {
def main(args: Array[String]) {
val a = 100
val b = 200
println("a 等于 b 是: " + (a == b))
println("a 不等于 b 是: " + (a != b))
println("a 大于 b 是: " + (a > b))
println("a 小于 b 是: " + (a < b))
println("b 大于等于 a 是: " + (b >= a))
println("b 小于等于 a 是: " + (b <= a))
}
}
逻辑运算符:&& || !
object Test {
def main(args: Array[String]) {
var a = true;
var b = false;
println(a&&b)
println(a||b)
println(!a)
}
}
赋值运算符: = += -= *= /= %=
var a = 10;
val b = 20;
var c = 0;
c = a + b;
println(c);
var a = 10;
var c = 0;
c += a ;
println( c );
var a = 10;
var c = 0;
c -= a ;
println( c );
var a = 10;
var c = 0;
c *= a ;
println("c *= a = " + c );
val a = 10;
var c = 15;
c /= a ;
println("c /= a = " + c );
val a = 10;
var c = 15;
c %= a ;
println("c %= a = " + c );
1)String 类型转换为Int
val age:String ="123"
println(age.toInt.getClass.getName)
2)Int 类型转换为String
val b:Int =123
println(b.toString.getClass.getName)
3)String类型转换为Float类型
val c:String ="123.123"
println(c.toFloat.getClass.getName)
第一种:
var br = new BufferedReader(new InputStreamReader(System.in))
var line = br.readLine()
第二种:
var int = Console.readInt()