Scala-1-BasicGrammar

环境配置和Scala安装

Docker

这里的scala我选择在docker的 ubuntu 容器里面进行安装和之后学习。 所以需要先把docker里面的ubuntu环境先配置好。

  1. 拉取和进入 ubuntu 镜像
    docker pull ubuntu:13.10
    docker run -it ubuntu
    由于从docker hub里面拉下来的ubuntu image里面基本什么包都没有, 需要自己安装一下一些常用工具, 比如 vim, curl, git
    apt-get install vim curl git

  2. 在ubuntu里面安装java
    apt-get update
    安装 java jdk, 或者jre, 不过一般jdk已经包括了jre, 可以只安装jdk就好
    apt-get install default-jdk
    apt-get install default-jre
    检查java环境是否安装成功
    #: java, #: javac

  3. 安装scala
    默认安装scala 2.x 版本
    apt-get install scala
    测试scala #: scala, 退出scala时用 :q:quit 命令

安装scala的另外一种方式是安装sbt工具, 它是用来管理比较大的scala项目的, 可以参考官网

  1. 安装Python 和spark
    由于学习scala的目的是学习大数据spark, 所以这里也一起把pyspark安装上去。
  • 安装python
    apt-get update
    apt-get install python3.8
    apt-get install pip

  • 安装pyspark
    安装pyspark的方法有几种, 可以参考 官网. 其中一种方法是直接下载源码来跑, 步骤如下

    1. PySpark下载地址 下载对应的版本pyspark, 比如 spark-3.2.0-bin-hadoop3.2.tgz

    2. 解压: tar -xzvf spark-3.2.0-bin-hadoop3.2.tgz 得到 spark-3.2.0-bin-hadoop3.2 目录

    3. ~/.bashrc 文件最后增加下面环境变量, 让python能够识别出pyspark的路径
      export SPARK_HOME=<your-pyspark-path>

      export PYTHONPATH=$(ZIPS=("$SPARK_HOME"/python/lib/*.zip); IFS=:; echo "${ZIPS[*]}"):$PYTHONPATH

    4. 进入python3.8 调用pyspark检查调用情况

Scala 语法

定义包

Scala 使用 package 关键字定义包,在Scala将代码定义到某个包中有两种方式:
第一种方法和 Java 一样,在文件的头定义包名,这种方法就后续所有代码都放在该包中
可以在一个文件中定义多个包。

1
2
3
4
5
6
package com.runoob
class HelloWorld
//或者
package com.runoob {
class HelloWorld
}

数据类型

Scala 里面的所有类型都是class, 不是 原生类型。 除了Byte, Int, Char, String, Long, Boolean, Float, Short, Double外, 还有 Unit, Any, Null, Nothing, AnyRef.

  • Unit 等同于void, 都是无值
  • Null: null 或空引用
  • Any: 所有其他类型的超类Super Class
  • AnyRef: 是Scala里面所有引用类型的基类BaseClass
  • Nothing: 是Scala如何其他类型的子类, 是最底层的类

变量

Scala 的变量用 val关键字定义。 Scala里面对变量的数据类型定义有下面3中方法:

  1. 对变量定义以及赋值

    1
    2
    3
    val var_name: DataType = value
    // 例子
    val myVal: String = "Foo";
  2. 只对变量定义 不赋值

    1
    val myval: String;
  3. 直接对变量赋值

不定义变量类型的话,一定要赋值

1
val myval = "value"

另外Scala的语句的分割符;分号在语句最后可加可不加。

  1. 多值赋值
  • 同时赋予相同值
    1
    2
    //同时给a, b 赋予100, 相同的值
    val a, b= 100
  • 同时赋予不同值, 使用tuple
    这里和python不一样,一定要加括号
    1
    2
    //同时给a, b 赋予100, 相同的值
    val a, b= (100,200)

修饰词public, private, protected

和Java一样, Scala有public, private, protected 关键词对函数, 变量, 类进行修饰。 使用方法:
private [x] <被修饰对象>, 这里的x指代某个所属的包、类或单例对象。如果写成private[x],读作”这个成员除了对[…]中的类或[…]中的包中的类及它们的伴生对像可见外,对其它所有类都是private。

例子

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
package bobsrockets{
package navigation{
private[bobsrockets] class Navigator{
protected[navigation] def useStarChart(){}
class LegOfJourney{
private[Navigator] val distance = 100
}
private[this] var speed = 200
}
}
package launch{
import navigation._
object Vehicle{
private[launch] val guide = new Navigator
}
}
}

类 Navigator 被标记为 private[bobsrockets] 就是说这个类对包含在 bobsrockets 包里的所有的类和对象可见。

运算符

Scala的运算符和C, python一样, 支持 !=,==, >=, <=, &, $$, >>, <<等。 另外scala也支持自加, 自乘等表示式, 如 a-=1, b*=3

逻辑表达式

Scala 的 if, else, for, while, do..while等和C一样。但是Scala 不支持 break, continue的操作。 使用break时要用到类。 比如调用 Breaks 类的break

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
// 导入以下包
import scala.util.control._

// 创建 Breaks 对象
val loop = new Breaks;

// 在 breakable 中循环
loop.breakable{
// 循环
for(...){
....
// 循环中断
loop.break;
}
}

函数定义

Scala 中使用 val 语句可以定义函数,def 语句定义方法

  • Scala 类的方法定义
    1
    2
    3
    4
    def functionName ([参数列表]) : [return type] = {
    function body
    return [expr]
    }

方法声明

1
def functionName ([参数列表]) : [return type]
  • 例子
    1
    2
    3
    4
    5
    6
    7
    class Test{
    //定义方法
    def m(x: Int) = x + 3
    //定义函数
    val f = (x: Int) => x + 3
    println(f(4))
    }

Scala 这里用的 val f = (x: Int) => x + 3 中,f 为函数名, 后面接输入的参数列表和对应的类型, 再加 箭头=>, 最后是公式。 这个有点像python的lambda x:x+3 的匿名函数写法

Reference

Java 安装教程

scala 安装教程

PySpark 安装教程

https://sparkbyexamples.com/spark/different-ways-to-create-a-spark-dataframe/

Comments