0
点赞
收藏
分享

微信扫一扫

Scala入门到放弃—01—概述

概述

什么是是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类库。 例如:ScalaInt是用Java的基本类型int实现的,Float是用Javafloat实现的,Boolean是用Javaboolean实现的,比如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)
  }

配置环境

安装

  1. 安装 Java 8
  2. 下载 download scala 网址:https://www.scala-lang.org/download/2.11.8.html
  3. 解压 unzip scala
  4. 配置环境变量(可选) Windows 需配置两个 Path中: D:\scala\binD:\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的变量分为两种:valvarvalJavafinal变量类似,一旦初始化就不能被重新赋值。而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)能力——能够推断出那些不显式指定的类型。在本例中,由于是用字符串字面量来初始化msgScala推断出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,只有当你第一次操作时才会去真正访问,如果不去访问,即使写错了,也不会发现

举报

相关推荐

0 条评论