Scala 新手村 2022.08.28 周日

一、基础

1.1) 安装

1)mac 下安装 scala

brew install coursier/formulas/coursier && cs setup

2) brew 安装

/bin/zsh -c "$(curl -fsSL https://gitee.com/cunkai/HomebrewCN/raw/master/Homebrew.sh)"

1.2)教程

二、 语法

2.1)Trait

Scala Trait(特征)
Scala Trait(特征) 相当于 Java 的接口,实际上它比接口还功能强大。

与接口不同的是,它还可以定义属性和方法的实现。

2.2) 数组

// 01 scala中的数组
var list1 = Array(1, 2)

// 02 数组值修改
list1(0) = 0

2.3)List -有序的对象集合

  • scala的 list比较鸡肋,还不如其 数组强大,list中的长度不但是固定的,而且里边的元素还不让修改,不过里边的元素可以是重复的元素
    如果要使用变长的,可以使用 ListBuffer
var list = List(1, 2, 3)
// 下面的操作是报错的
list(0) = 1

2.4)Set - 无序的不可重复对象集合

  • scala 中的 Set 有 不可变和可变两个版本,分别是 scala.collectioin.immutable 中 和 scala.collection.mutable 中的,默认是 不可变的,需要可变的,则需要导入前边说的这个包
  • 虽然可变Set和不可变Set都有添加或删除元素的操作,但是有一个非常大的差别。对不可变Set进行操作,会产生一个新的set,原来的set并没有改变,这与List一样。 而对可变Set进行操作,改变的是该Set本身,与ListBuffer类似。

不可变 Set

scala> var immutableSet = scala.collection.immutable.Set(1,2)
immutableSet: scala.collection.immutable.Set[Int] = Set(1, 2)

scala> immutableSet.add(3)
<console>:30: error: value add is not a member of scala.collection.immutable.Set[Int]
       immutableSet.add(3)
                    ^

可变Set

scala> var mutableSet = scala.collection.mutable.Set(1, 2)
mutableSet: scala.collection.mutable.Set[Int] = Set(1, 2)

scala> mutableSet.add(3)
res24: Boolean = true

scala> mutableSet
res25: scala.collection.mutable.Set[Int] = Set(1, 2, 3)

2.5) Seq

  • Seq 是 Scala的集合之一,另外两个是 SetMap, Seq 也是有 可变和不可变两种
  • 参考文档:https://blog.csdn.net/weixin_40161254/article/details/115738584
    在这里插入图片描述
    -说明: 序列表示一个以特定顺序排列的元素集合。因为该元素有个定义好的顺序,所以可以按照它们在集合中的位置进行访问。例如,可以请求序列中第n个元素。

Seq下包含了Range、ArrayBuffer、List等子trait。其中Range就代表了一个序列,通常可以使用“1 to10”这种语法来产生一个Range。 ArrayBuffer就类似于Java中的ArrayList。

序列有三个实现类,分别是Array、List和Vector。

  • Seq添加元素: https://blog.csdn.net/qq_39532946/article/details/77772865
scala> data :+ 6
res29: scala.collection.mutable.Seq[Int] = ArrayBuffer(1, 2, 3, 4, 5, 6)

2.6)元组

  • Scala 可以返回多个参数,用元组就可以做到这一点
  • info._1 访问元组中的第一个元素, info._2 是访问元组中的第2个元素

2.7) 其他语法

  • 传递变长参数,在参数类型后加上 * 就行
  • 可以为参数提供默认值
  • scala 还支持 命名参数比如 power( base = 2, exponent = 3)
  • scala 还支持 隐式传参,由调用者确定传递的参数的默认值

三、Scala 与 Java 的区别

  • https://cloud.tencent.com/developer/article/1758874

    1. Scala中不支持break

使用return替代

在循环中使用if和布尔类型变量

导入Java中支持break的包

    1. 通配符

Java中使用*进行通配

Scala中使用_进行通配

  • 3)Scala的 ==
    Scala中的 == 等价于 Java的 equals() 方法;
    Scala中的 操作符 eq 等价于 Java的 == 操作

  • 4) Scala的初学者,可以先在代码中 使用 util.HashMap等 Java的类来实现自己的逻辑

四、Spark相关

4.1) RDD

4.1.1) RDD的创建

  • 01 从 Driver 程序的数据集生成 RDD
val data = Seq(1, 2, 3, 4, 5)

// sc 指的是 saprk-shell已经创建好的 sparkContext
val rdd = sc.parallelize(data)

parallelize的理解: 第2个参数,代表了 partition RDD分区,Spark在运行时,一般 RDD操作会为每个RDD 分区运行一个 Job,关于 Job,可以简单理解为 Java的一个线程

  • 02 从外部数据集生成 RDD
    主要是使用 sparkContext的 textFile() 方法

4.1.2) RDD的使用

  • Spark编程时,RDD操作的一个禁忌,就是 RDD操作不能嵌套吊影,即在 RDD 操作的传入的函数参数的函数体中,不可以出现 RDD的调用
    • foreach 是 RDD的 Action 操作
    • rdd的求和,可以使用 rdd.sum, 或者 rdd.reduce(_+_)
4.1.2.1) 两类操作

4.2) Spark SQL

  • 概述: 使用方式。Spark SQL有两种使用方式:
    == 一种是分布式 SQL引擎,此时主要是写 SQL就可以进行计算
    == 一种是在 Spark 程序中,通过领域 API的形式来操作数据(被抽象为 DataFrame)

4.2.1) DataFrame

4.2.1.1)创建DataFrame
- 有两种方法:
	- 从 RDD创建:
	== ① 使用反射的方法从 RDD 创建 DataFrame
	== ② 使用程序动态从 RDD 创建 DataFrame
4.2.1.2)DataFrame的使用
  • 可以通过 领域API的方式访问 DataFrame
  • 可以将 DataFrame 注册成表,然后通过 SQL语句的方式来访问
var sqlContext = new org.apache.spark.sql.SQLContext(sc)
scala> df.registerTempTable("people")
warning: one deprecation (since 2.0.0); for details, enable `:setting -deprecation' or `:replay -deprecation'

scala> sqlContext.sql("select * from people")
res21: org.apache.spark.sql.DataFrame = [age: bigint, name: string]

scala> var result = sqlContext.sql("select * from people")
result: org.apache.spark.sql.DataFrame = [age: bigint, name: string]

scala> result.show()
+---+-----------+
|age|       name|
+---+-----------+
| 35| ZhouJieLun|
| 36|FangWenShan|
+---+-----------+

在这里插入图片描述
在这里插入图片描述

五、面向对象

  • Scala Object对象本身就是 单实例的,它的方法都是静态方法。
  • Scala 中, Any 类型是所有类型的父类型, 而 Nothing 则是一切类型的子类型

六、其他

6.1)以独立脚本方式运行 Scala 代码

  • 文件名 hello.sh
#!/usr/bin/env scala

println("Hello " + args(0))

chomd +x hell0.sh

./hello.sh Scala
运行结果
Hello Scala

七、Spark优化

7.1)优化原则

  • 尽量避免使用shuffle类算子
    https://tech.meituan.com/2016/04/29/spark-tuning-basic.html
    • 比如reduceByKey、join等算子,都会触发shuffle操作。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值