定义
专为大规模数据处理而设计的快速通用的计算引擎,并形成一个高速发展应用广泛的生态系统。
特点
- 速度快
- 内存计算下,Spark 比 Hadoop 快100倍
- 易用性
- 80多个高级运算符
- 跨语言:使用Java,Scala,Python,R和SQL快速编写应用程序。
通用性
spark streaming:实时数据处理
- shark/sparkSQL:用sql语句操作spark引擎
- sparkR:用R语言操作Spark
- mlib:机器学习算法库
- graphx:图计算组件
在Hadoop生态圈中位置
在hadoop生态圈中位置
在spark生态圈
就业前景
- 成熟度相比于hadoop还差一些,但自身迭代和生态圈发展很快。
- 业务对实时性要求日渐增高,各大公司和小公司都在积极调研转向spark,都需要懂spark、用spark的人
- Spark特别适合于迭代运算比较多的机器学习算法,而机器学习正在如火如荼发展中。
- Spark未来可能会取代MapReduce,但与Hadoop仍会友好共生。
- 基于内存计算是最大优势,而内存瓶颈会越来越少,故Spark的爆发点还有很大空间。
- 总结:岗位需求量和发展前景都很广阔,是未来3-5年的技术应用最大热门。
Scala
- 语言介绍
- 多范式(multi-paradigm)的编程语言,设计初衷是要集成面向对象编程和函数式编程的各种特性。
- 运行在 Java 虚拟机上,并兼容现有的 Java 程序。
- 源代码被编译成 Java 字节码文件,运行于 JVM 之上,并可以调用 现有的 Java 类库
- 语言特点
- 面向对象特性
- 一种纯面向对象的语言,每个值都是对象
- 函数式编程
- 函数式语言,其函数也能当成值来使用。
- 提供了轻量级的语法用以定义匿名函数,支持高阶函数,允许嵌套多层函数,并支持柯里化。
- 静态类型
- 具备类型系统,通过编译时检查,保证代码的安全性和一致性。
- 像 scala,java,c/c++,c#,golang 等属于静态类型。
- 像 python,ruby,javascript 等属于动态语言。
- 扩展性
- 提供了许多独特的语言机制,可以以库的形式轻易无缝添加新的语言结构。
- 并发性
- 其并没有在底层对语言的并发性做更新升级。
- 使用 Actor 作为其并发模型
- 面向对象特性
应用前景
- 技术方面
- 完全兼容 Java,运行于 JVM 虚拟机之上。
- 支持函数式编程和类型推断
- 结合面向过程和面向对象,并保证代码简洁及优雅
- 开发工具 IDE 非常成熟
- 应用方面
- LinkedIn/Twitter/英国卫报等众多企业已全面生产应用 Scala, 或替换 Java 代码。
- spark/kafka 等大数据开发组件的巨大爆发力,使 Scala 为国内 所热捧。
基础语法
基本概念
o 对象:类的一个具体实例,对象包含属性和方法,如旺财有属性
毛色和看家本领能力。
o 类:类是对象的抽象,对象是类的一个实例。
o 方法:描述类所拥有的行为能力,一个类可以拥有多个方法。
o 属性:也称字段,即每个对象拥有它自身实例变量集合,通过赋
值来创建真正的属性值。
- 基本语法
- 区分大小写
- 类名:首字母要大写,如 class HelloWorld{},class Person{},class Student{},也称大驼峰
- 方法名称:首字母小写,从第 2 个单词开启的首字段大写,如 def toString(),def getName(),即为小驼峰
- 程序文件名:保持与类名或对象名一致,区分大小写,以 “.scala”来结尾。
- 主程序入口:def main(args: Array[String]) ,scala 若要独立运行 必须从 main 方法开始处理,每个 scala 强制程序入口。
- 标识符
- 兼容 java 标识符命名规范
- 命名规范:类为大驼峰,其它为小驼峰
- 多符号命名:可以加入“$,+,++,<“等符号参与命名,注意首字 符和尾字符的若干限制,如”$”不要作为开头,”_”不要作为结 尾。
- 有新增关键字,如 yield 成为 scala 新关键字,则在 scala 调用 时,则应由 Thread.yield()改成 Thread.
yield来使用。
- 关键字
- 以下为保留关键字,不要以关键字作为变量命名

- 以下为保留关键字,不要以关键字作为变量命名
- 注释
- 兼容 Java 注释,支持单行和多行
- 支持多行注释的嵌套结构
- 换行符
- 面向行编程的语言,每行语句可以用显式的”;”来结尾,或者以回 车换行来结尾。即末尾的”;”是可选的。
- 如果一行中包括多个语句,则必须用”;”来分隔。
包定义
- 兼容 java 包方式,如 package com.tl.utils;
- 类 c#的包定义方式
package com.tl.test {class MyTest {}
引用
- 引入单个类:import java.util.Date;
- 引入包下所有类:import java.util._;
- 引入包下若干类(选择器):import java.util.{Date,HashSet,HashMap}
- 引入类后重命名:import java.util.{Date => OldDate}
- 隐藏包下的部分成员:import java.util.{Date=>,}
- 默认包引入为:java.lang.、scala.、Predef._,默认引入的 包的情况下其内类的使用均不需要加上包名。
数据类型
- 与 Java 相似部分(皆为对象类型,scala 无原生数据类型)
- Byte,Short,Int,Long,Float,Double,Char,String,Boolean
差异部分
- Unit:即为空值或无值,与 Java 中的 void 等同。
- Null:即为 null,即空引用
- Nothing:是任何类型的子类型,在 scala 类层级的最末端
- Any:是所有其它类的基(父)类
- AnyRef:是所有引用类的基础,即除了值类型之外
- AnyVal:是所有值类型的基类,包括 9 个值类型scala.Double
scala.Floatscala.Longscala.Intscala.Charscala.Shortscala.Bytescala.Unitscala.Boolean
数据类型的关系图

- 常见字面量
- 整型字面量:如:0,1,0xff,07L
- 浮点型字面量:0.0,3.14159f
- 布尔型字面量:true 或者 false
- 字符字面量:单引号括起来,如’a’,’b’,’\t’
- 字符串字面量:双引号括起来,如”HelloWorld”,”MyName”
- Null 值:是对引用对象类型的子类,不兼容值类型。
变量
常量
- 在程序运行过程中其值不会发生变化的量叫做常量。如:”A”、 “B”、”123”太丰富
- 使用 val 来声明常量
val constString:String="hero";constString="new_hero";
变量
- 在程序运行过程中其值可能发生改变的量叫做变量。如:对象的
- 名称、年龄、发色、身材等
- 使用 var 来声明变量
var varString:String="name";varString="new_name";
变量类型声明
scala 访问修饰符包括 private,protected,public,对象的访问级别默认都是 public
- private
- 仅在包含了成员定义的类或对象内部可见
- 在嵌套类情况下,外层类甚至不能访问被嵌套类的私有成员。
- protected
- 比 java 的 protected 更严格,除了子类可以访问,同包下的类是不能访问的
- public
- 跟 Java 完全一致
- 作用域保护
- 通过 private[x]或 protected[x]来实现,可以修饰包、类、单例 对象。
- private[x],即为”这个成员除了对[…]中的类或[…]中的包中的 类及它们的伴生对像可见外,对其它所有类都是 private。
- protected[x],即为”这个成员除了对[…]中的类或[…]中的包中的类及它们的伴生对像可见外,对其它所有类都是 protected。
- private
运算符
- 算术运算符
- 关系运算符
- 逻辑运算符
- 位运算符
- 常用位运算
- 用来对二进制位进行操作,~,&,|,^分别为取反,按位与与,按位与或,按位与异或运算

- 用来对二进制位进行操作,~,&,|,^分别为取反,按位与与,按位与或,按位与异或运算
- 常用位运算
- 全部位运算符
- 赋值运算符
- 运算符优先级






