文章目录
- 概述
- 什么是是Scala?
- 为什么要使用Scala?
- 配置环境
- 安装
- 测试
- 附
- 基本语法
- 定义变量
- 基本数据类型
- lazy在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这个名字来源于“scalable language
”,即“可伸缩的语言”。
它的设计目标随着用户的需求一起成长。
Scala可被广泛应用于各种编程任务,从编写小型的脚本到构建巨型系统,它都能胜任。
为什么要使用Scala?
大教堂指的是那种近乎完美的建筑,修建需要很长的时间,不过一旦建好,就很长时间不做变更。而市集则不同,每天都会有工作于其中的人们不断地对市集进行调整和扩展。Scala更像是市集而不是大教堂,其主要的设计目标就是让用Scala编程的人们可以对它进行扩展和定制。
- Scala是兼容的
Scala程序会被编译成JVM
字节码,它们的运行期性能通常也跟Java
程序相当。同时Scala
代码可以调用Java
方法、访问Java
字段、从Java
类继承、实现Java
接口。要实现这些并不需要特殊的语法,几乎所有的Scala
代码都重度使用Java
类库。
例如:Scala
的Int
是用Java
的基本类型int
实现的,Float
是用Java
的float
实现的,Boolean
是用Java
的boolean
实现的,比如Scala
的字符串字面量“abc
”是一个java.lang.String
,而抛出的异常也必须是java.lang.Throwable
的子类。
-
Scala是简单的
Scala编写的程序通常都比较短。对比一些大数据中WordCount
的实现; -
Java
public static class WordCountMapper extends Mapper<LongWritable, Text,Text, IntWritable>{
protected void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException {
//key表示读取的行偏移量,value表示读取的行内容
String[] words = value.toString().split(" ");
for (String word:words) {
context.write(new Text(word),new IntWritable(1));
}
}
}
public static class WordCountReducer extends Reducer<Text, IntWritable,Text, IntWritable>{
protected void reduce(Text key, Iterable<IntWritable> values, Context context) throws IOException, InterruptedException {
int sum = 0;
for (IntWritable value:values) {
sum+=value;
}
context.write(key,new IntWritable(sum));
}
}
public static void main(String[] args) throws IOException, ClassNotFoundException, InterruptedException {
Configuration conf=new Configuration();
conf.set("fs.defaultFS", "hdfs://master:9000");
Job job=Job.getInstance(conf);
job.setJarByClass(WcJob.class);
job.setMapperClass(WcMapper.class);
job.setReducerClass(WcReduce.class);
job.setMapOutputKeyClass(Text.class);
job.setMapOutputValueClass(IntWritable.class);
job.setOutputKeyClass(Text.class);
job.setOutputValueClass(IntWritable.class);
Path path = new Path("/wordcount/out/demo1");
FileInputFormat.setInputPaths(job,new Path("/wordcount/in/hello.txt"));
FileOutputFormat.setOutputPath(job,path);
boolean isDone = job.waitForCompletion(true);
System.exit(isDone ? 0 : 1);
}
- Scala
def main(args: Array[String]): Unit = {
val lines = Array("hello word hello tim","hello java hello java","hello tim jim")
val conf: SparkConf = new SparkConf().setMaster("local[2]").setAppName(this.getClass.getSimpleName)
val sc: SparkContext = new SparkContext(conf)
val value = sc.textFile("in\\wc.txt")
//scala实现
val res1=lines.flatMap(_.split(" "))
.map((_,1))
.groupBy(_._1)
.map(x=>(x._1,x._2.size))
.toList
.sortBy(_._2).reverse
println(res1)
}
配置环境
安装
- 安装
Java 8
- 下载
download scala
网址:https://www.scala-lang.org/download/2.11.8.html - 解压
unzip scala
- 配置环境变量(可选)
Windows
需配置两个 Path中:D:\scala\bin
和D:\scala\jre\bin
测试
附
Linux或Mac中操作步骤:
1.tar -zxvf scala-2.11.8.tgz -C 解压路径
2.到解压目录下 pwd 复制整个路径
3.将上面的路径 添加到环境变量中
vi ~/.bash_profile
export SCALA_HOME=复制的路径
export PATH=$SCALA_HOME/bin:$Path
保存
source ~/.bash_profile
echo $SCALA_HOME
下载之后的scala目录下的bin目录中 有普通文件 和 .bat文件
.bat文件是在Windows中用的,Linux或Mac中用不到,所以可以删掉 rm *.bat
基本语法
定义变量
Scala的变量分为两种:val
和var
。val
跟Java
的final
变量类似,一旦初始化就不能被重新赋值。而var
则不同,类似于Java
的非final
变量,在整个生命周期内var
可以被重新赋值。如下是val
的定义:
- val:值
final
val 值名称:类型=xx
val a = 1 (不可变)
val a : int = 1
- var:变量
var 值名称:类型=xxx
var b = 1
var b : int = 1
在val
的定义中,既没有java.lang.String
,也没有String
。这个示例展示了Scala
的类型推断(type inference
)能力——能够推断出那些不显式指定的类型。在本例中,由于是用字符串字面量来初始化msg
,Scala
推断出msg
的类型是String
。要在解释器中分多行录入代码,只需要在第一行之后直接按回车继续就好。如果当前键入的内容不完整,解释器会自动在下一行的头部加上竖线(|
)。
基本数据类型
Byte/Char
Short/Int/Long/Float/Double
Boolean
- 只有
Float
声明时比较特别
var c : Float = 1.1f
scala> b=20
b: Int = 20
scala> val b:Int =10
b: Int = 10
scala> val c:Boolean=true
c: Boolean = true
scala> val d =1.1
d: Double = 1.1
scala> val e:Float=1.2f
e: Float = 1.2
lazy在Scala中的应用
lazy var d : int = 1;
延迟加载,只有在第一次使用时才加载
读取文件并以字符串形式输出
import scala.io.Source._
var info = fromFile("...").mkString
如果用lazy var info = fromFile(“…”).mkString,开始是检测不到错误的,要小心使用
*注意:当一个变量声明为lazy,只有当你第一次操作时才会去真正访问,如果不去访问,即使写错了,也不会发现