Scala-初学

前提,已经安装好Scala

在Linux终端

准备资料:

a.txt 内容

HIVE 底层 是 hdfs 和 mapreduce 实现存储 和 计算的 。

HIVE 也 可以 使用 hadoop 配置 的 压缩 方法 对 中间 结果 或 最终 数据 进行 压缩

1

import scala.io.Source

scala> val lines = Source.fromFile("/usr/local/src/test_data/a.txt").getLines()

lines: IteratorString = non-empty iterator

Iterator : 迭代器,不是一个集合

it...next() : 返回迭代器中的下一个元素,同时更新迭代器的状态

it.hasNext(): 用于检查迭代器中是否还有元素

scala> val lines = Source.fromFile("/usr/local/src/test/a.txt").getLines().toList

toList:将迭代器中的元素归入到列表中进行返回

Range

定义: 序列, 包括起点和终点,按照给定步长的所有值,是一个特殊的Array

  1. [0,5)
bash 复制代码
scala> val a= Range(0,5)
a: scala.collection.immutable.Range = Range(0, 1, 2, 3, 4)

等价于

bash 复制代码
scala> val a = 0 until 5
a: scala.collection.immutable.Range = Range(0, 1, 2, 3, 4)

2.0,5

bash 复制代码
scala> val a = 0 until 5
a: scala.collection.immutable.Range = Range(0, 1, 2, 3, 4)

等价于

bash 复制代码
scala> val a = 0.to(5)
a: scala.collection.immutable.Range.Inclusive = Range(0, 1, 2, 3, 4, 5)

3.Range 和 list 转换

bash 复制代码
scala> val list1 = (1 to 20).toList
list1: List[Int] = List(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20)

map

对 a 的每个元素进行遍历然后 * 2

bash 复制代码
scala> val a = 1 to 5
a: scala.collection.immutable.Range.Inclusive = Range(1, 2, 3, 4, 5)
scala> a.map(x=>x*2)
res0: scala.collection.immutable.IndexedSeq[Int] = Vector(2, 4, 6, 8, 10)

Vector 是一个容器,保存其他的数据对象,也可以称为集合,是Scala标准包的,不用导包

1.创建Vector 对象

bash 复制代码
scala> var v1 = Vector(1,2,3)
v1: scala.collection.immutable.Vector[Int] = Vector(1, 2, 3)

2.索引Vector中的元素,索引是从0开始的

bash 复制代码
scala> print(v1(0))
1

3 遍历Vector

bash 复制代码
scala> for(i<-v1) print(i+"/")
1/2/3/

Scala中(下划线) _ 的用法

1,获取集合中的每一个元素

bash 复制代码
scala> a.map(_*2)
res3: scala.collection.immutable.IndexedSeq[Int] = Vector(2, 4, 6, 8, 10)

2 获取元组(Tuple)中的元素

bash 复制代码
scala> val s = ("hello","scala")
s: (String, String) = (hello,scala)

scala> s._1
res4: String = hello

scala> s._2
res5: String = scala

3 导入所有包

bash 复制代码
import scala.io._

4 初始化变量 val 声明的变量不能被修改

bash 复制代码
scala> var name:String=_
name: String = null

scala> var age:Int=_
age: Int = 0

函数 split

bash 复制代码
scala> var s = "all back money"
s: String = all back money

scala> s.split(" ")
res6: Array[String] = Array(all, back, money)

打平函数:

flatten

bash 复制代码
scala> val s1 = List(Range(1,5),Range(0,5),Range(0,5))
s1: List[scala.collection.immutable.Range] = List(Range(1, 2, 3, 4), Range(0, 1, 2, 3, 4), Range(0, 1, 2, 3, 4))

scala> val s2 = s1.flatten
s2: List[Int] = List(1, 2, 3, 4, 0, 1, 2, 3, 4, 0, 1, 2, 3, 4)

1.针对每一个元素 * 2

bash 复制代码
方式一:
scala> s2.map(x=>x*2)
res9: List[Int] = List(2, 4, 6, 8, 0, 2, 4, 6, 8, 0, 2, 4, 6, 8)
方式二:
scala> s2.map(_*2)
res9: List[Int] = List(2, 4, 6, 8, 0, 2, 4, 6, 8, 0, 2, 4, 6, 8)

2 针对s1每个元素直接*2

bash 复制代码
方式一:
scala> s1.map(x=>x.map(x=>x*2))
res10: List[scala.collection.immutable.IndexedSeq[Int]] = List(Vector(2, 4, 6, 8), Vector(0, 2, 4, 6, 8), Vector(0, 2, 4, 6, 8))
方式二:
scala> s1.map(_.map(_*2))
res11: List[scala.collection.immutable.IndexedSeq[Int]] = List(Vector(2, 4, 6, 8), Vector(0, 2, 4, 6, 8), Vector(0, 2, 4, 6, 8))

flatMap

bash 复制代码
scala> s1.flatMap(_.map(_*2))
res12: List[Int] = List(2, 4, 6, 8, 0, 2, 4, 6, 8, 0, 2, 4, 6, 8)

等价于

scala> s1.map(_.map(_*2)).flatten
res13: List[Int] = List(2, 4, 6, 8, 0, 2, 4, 6, 8, 0, 2, 4, 6, 8)

练习:对lines进行 wordCount

bash 复制代码
scala> val lines = Source.fromFile("/usr/local/src/test_data/a.txt").getLines().toList
lines: List[String] = List("HIVE 底层 是 hdfs 和 mapreduce 实现存储 和 计算的 。 ", HIVE 也 可以 使用 hadoop 配置 的 压缩 方法 对 中间 结果 或 最终 数据 进行 压缩)

scala> lines.map(_.split(" "))
res7: List[Array[String]] = List(Array(HIVE, 底层, 是, hdfs, 和, mapreduce, 实现存储, 和, 计算的, 。), Array(HIVE, 也, 可以, 使用, hadoop, 配置, 的, 压缩, 方法, 对, 中间, 结果, 或, 最终, 数据, 进行, 压缩))

scala> lines.map(_.split(" ")).flatten
res14: List[String] = List(HIVE, 底层, 是, hdfs, 和, mapreduce, 实现存储, 和, 计算的, 。, HIVE, 也, 可以, 使用, hadoop, 配置, 的, 压缩, 方法, 对, 中间, 结果, 或, 最终, 数据, 进行, 压缩)

scala> lines.flatMap(_.split(" "))
res15: List[String] = List(HIVE, 底层, 是, hdfs, 和, mapreduce, 实现存储, 和, 计算的, 。, HIVE, 也, 可以, 使用, hadoop, 配置, 的, 压缩, 方法, 对, 中间, 结果, 或, 最终, 数据, 进行, 压缩)
相关推荐
秋937 分钟前
Go语言(Golang)开发工程师全景解析:岗位职责·语言优势与使用场景·各城市薪资·发展前景·高考志愿填报(2026版)
开发语言·golang·高考
IT_陈寒1 小时前
Redis持久化这个坑,我爬了一整天才出来
前端·人工智能·后端
无风听海1 小时前
多租户系统中的 OIDC:Discovery 端点与联合登录的深度实践
后端·python·flask
小小前端仔LC1 小时前
Node.js + LangChain + React:搭建个人知识库(六)- “吃什么”项目实战:从700+菜谱入库到Taro H5端JSON渲染
前端·后端
huangdong_1 小时前
1688商品图片采集技术解析:登录态处理与SKU图自动分类
开发语言
chase_my_dream2 小时前
C++ + SLAM 高频面试问题整理
开发语言·c++·面试
程序员黑豆2 小时前
AI全栈开发之Java:怎么配置Java环境变量
前端·后端·ai编程
Cloud_Shy6182 小时前
解读《Effective Python 3rd Edition》:从练气到老魔(第五章 Item 30 - 32)
开发语言·人工智能·笔记·python·学习方法
苍何2 小时前
一手实测 Claude Fable 5,手搓了个 Obsidian 的 Codex 插件
后端
天佑木枫2 小时前
15天Python入门系列 · 序
开发语言·python