Spark大数据分析与实战笔记(第一章 Scala语言基础-5)
文章目录
- 每日一句正能量
- 章节概要
- 1.5 Scala的模式匹配与样例类
- 1.5.1 模式匹配
- 字符匹配
- 匹配字符串
- 守卫
- 匹配类型
- 匹配数组、元组、集合
- 1.5.2 样例类
- 课外补充
- 偏函数
每日一句正能量
“成功的秘诀,在于对目标的执着追求。”——爱迪生
无论是在工作、学习、还是生活中,只有对目标有着真正的执着追求,才有可能取得成功。爱迪生是个成功的发明家,也是一个努力不懈、坚持不断的实践者。他曾说过:“没有人能够一次成功,成功的秘诀就在于多次失败后依然不放弃对目标的执着追求。”
所以,只有对自己的目标有着强烈的追求,才能在取得成果的路上坚持不懈地去奋斗,才能不怕失败,不放弃,不断地提高自己的能力和技巧。每一次失败都是向成功更近一步的机会,只要时刻保持目标的执着追求,坚信自己一定能够取得成功,就一定会迈向胜利。
章节概要
Spark是专为大规模数据处理而设计的快速通用的计算引擎,它是由Scala语言开发实现的,关于大数据技术,本身就是计算数据,而Scala既有面向对象组织项目工程的能力,又具备计算数据的功能,同时Spark和Scala的紧密集成,本书将采用Scala语言开发Spark程序,所以学好Scala将有助于我们更好的掌握Spark框架。
1.5 Scala的模式匹配与样例类
Scala提供了强大的模式匹配机制,最常见的模式匹配就是math语句,主要应用于从多个分支中进行选择的场景。
1.5.1 模式匹配
- Scala中的模式匹配是由match case组成,它类似于Java中的switch case。
- match关键字主要用来描述一个表达式,位于表达式位置的后面。
- case关键字主要用来描述和表达式结果进行比较后的模式。
创建模式匹配的语法格式如下:
表达式 match {case 模式1 => 语句1case 模式2 => 语句2case 模式3 => 语句3
}
下面,定义一个方法matchTest(),方法的参数是一个整形字段,而方法的调用则是对参数进行模式匹配,若参数匹配的是1,则打印输出“one”;若参数匹配的是2,则打印输出“two”;若参数匹配的是_,则打印输出“many”,具体实现代码如下所示。
package cn.itcast.scalaobject Ch12_PatternMatch {def main(args: Array[String]): Unit = {println(matchTest(5))}//模式匹配def matchTest(x:Int):String = x match{case 1 => "one"case 2 => "two"case _ => "many"}
}
结果如下图所示:

字符匹配
def main(args: Array[String]): Unit = {val charStr = '6'charStr match {case '+' => println("匹配上了加号")case '-' => println("匹配上了减号")case '*' => println("匹配上了乘号")case '/' => println("匹配上了除号")//注意。所有的模式匹配都必须最终匹配上一个值,如果没有匹配上任何值,就会报错// case _ => println("都没有匹配上,我是默认值")}}
匹配字符串
def main(args: Array[String]): Unit = {val arr = Array("hadoop", "zookeeper", "spark")val name = arr(Random.nextInt(arr.length))name match {case "hadoop" => println("大数据分布式存储和计算框架...")case "zookeeper" => println("大数据分布式协调服务框架...")case "spark" => println("大数据分布式内存计算框架...")case _ => println("我不认识你...")}}
守卫
模式匹配当中,我们也可以通过条件进行判断def main(args: Array[String]): Unit = {var ch = "500"var sign = 0ch match {case "+" => sign = 1case "-" => sign = 2case _ if ch.equals("500") => sign = 3case _ => sign = 4}println(ch + " " + sign)
}
匹配类型
def main(args: Array[String]): Unit = {//注意泛型擦除,在模式匹配当中的类型匹配中,除了Array类型以为,所有的其他的数据类型都会被擦除掉val a = 3val obj = if(a == 1) 1else if(a == 2) "2"else if(a == 3) BigInt(3)else if(a == 4) Map("aa" -> 1)else if(a == 5) Map(1 -> "aa")else if(a == 6) Array(1, 2, 3)else if(a == 7) Array("aa", 1)else if(a == 8) Array("aa")val r1 = obj match {case x: Int => xcase s: String => s.toIntcase BigInt => -1 //不能这么匹配case _: BigInt => Int.MaxValuecase m: Map[String, Int] => "Map[String, Int]类型的Map集合"case m: Map[_, _] => "Map集合"case a: Array[Int] => "It's an Array[Int]"case a: Array[String] => "It's an Array[String]"case a: Array[_] => "It's an array of something other than Int"case _ => 0}println(r1 + ", " + r1.getClass.getName)}
匹配数组、元组、集合
def main(args: Array[String]): Unit = {val arr = Array(0, 3, 5)arr match {case Array(0, x, y) => println(x + " " + y)case Array(0) => println("only 0")//匹配数组以1 开始作为第一个元素case Array(1, _*) => println("0 ...")case _ => println("something else")}val lst = List(3, -1)lst match {case 0 :: Nil => println("only 0")case x :: y :: Nil => println(s"x: $x y: $y")case 0 :: tail => println("0 ...")case _ => println("something else")}val tup = (1, 3, 7)tup match {case (1, x, y) => println(s"1, $x , $y")case (_, z, 5) => println(z)case _ => println("else")}
}
注意:在Scala中列表要么为空(Nil表示空列表)要么是一个head元素加上一个tail列表。
9 :: List(5, 2) :: 操作符是将给定的头和尾创建一个新的列表
注意::: 操作符是右结合的,如9 :: 5 :: 2 :: Nil相当于 9 :: (5 :: (2 :: Nil))
1.5.2 样例类
- 在Scala中,使用case关键字来定义的类被称为样例类。
- 样例类是一种特殊的类,经过优化可以被用于模式匹配。
样例类首先是类,除此之外它是为模式匹配而优化的类,样例类用case关键字进行声明。样例类主要是使用在我们后面的sparkSQL当中,通过样例类来映射我们的表当中的对象
定义形式:
- case class 类型,是多例的,后面要跟构造参数。形式如下。
case class Student(name:String)
- case object 类型,是单例的。 形式如下。
case object Person
下面,使用case关键字来定义样例类Person,并将该样例类应用到模式匹配中,具体代码如下所示。
package cn.itcast.scalaobject Ch13_CaseClass {//定义样例类case class Person(name:String,age:Int)def main(args: Array[String]): Unit = {//创建样例类对象val alice = new Person("Alice", 25)val bob = new Person("Bob", 32)val charlie = new Person("Charlie", 33)//val tom = Person("tom",26) //这种方式创建也可以for(person <- List(alice,bob,charlie)){//模式匹配person match {case Person("Alice",25) => println("Hi Alice")case Person("Bob", 32) => println("Hi Bob")case Person("Charlie", 33) => println("Hi Charlie")//找不到以上匹配时case Person(name,age) => println("Name:"+name+"\t"+"Age:"+age)}}}
}
结果如下图所示:

课外补充
偏函数
被包在花括号内没有match的一组case语句是一个偏函数,它是PartialFunction[A, B]的一个实例,A代表输入参数类型,B代表返回结果类型,常用作输入模式匹配,偏函数最大的特点就是它只接受和处理其参数定义域的一个子集。
val func1: PartialFunction[String, Int] = {case "one" => 1case "two" => 2// case _ => -1}def func2(num: String) : Int = num match {case "one" => 1case "two" => 2case _ => -1}def main(args: Array[String]) {println(func1("one"))println(func2("one"))//如果偏函数当中没有匹配上,那么就会报错,我们可以通过isDefinedAt来进行判断// println(func1("three"))println(func1.isDefinedAt("three"))if(func1.isDefinedAt("three")){println("hello world")}else{println("world hello")}
}
转载自:https://blog.csdn.net/u014727709/article/details/133977059
欢迎start,欢迎评论,欢迎指正
相关文章:
Spark大数据分析与实战笔记(第一章 Scala语言基础-5)
文章目录 每日一句正能量章节概要1.5 Scala的模式匹配与样例类1.5.1 模式匹配字符匹配匹配字符串守卫匹配类型匹配数组、元组、集合 1.5.2 样例类 课外补充偏函数 每日一句正能量 “成功的秘诀,在于对目标的执着追求。”——爱迪生 无论是在工作、学习、还是生活中&…...
shell学习脚本04(小滴课堂)
他就可以直接读出来了。不需要在sh后面加参数。 可以用-s隐藏内容: 可以用-t进行指定几秒后显示。 -n限制内容长度。 输入到长度为5自动打印。 我们把-s放到-p后面的话: 这样会出错。 如果最后加5m会一直闪烁。 大家可以按照需求自行使用。...
Python数据结构(链表)
Python数据结构(链表) 单向链表 单向链表也叫单链表,是链表中最简单的一种形式,它的每个节点包含两个域,一个信息域(元素域)和一个链接域。这个链接指向链表中的下一个节点,而最后一个节点的链接域则指向…...
连续/离散的控制系统阶跃测试(包括MATLAB里的step()函数)
阶跃测试 只要是连续时间系统,无论是传递函数还是连续状态空间形式的模型,直接可以用**step()**做阶跃测试;但是对于离散系统而言,不能用step()函数,可以自行编写代码,如下。 1、离散系统:x(k…...
【六:pytest框架介绍】
常见的请求对象requests.get()requests.post()requests.delete()requests.put()requests.request()常见的响应对象reprequests.request()//返回字符串格式数据print(req.text)//返回字节格式数据print(req.content)//返回字典格式数据print(req.json)#状态码print(req.status_c…...
提升医院安全的关键利器——医院安全(不良)事件报告系统源码
医院是人们寻求医疗服务和康复的场所,安全是医院运营的基石。然而,医疗过程中不可避免地会出现不良事件,如药物错误、手术事故等。为了及时发现、评估和解决这些问题,医院安全(不良)事件报告系统应运而生。…...
【瑞吉外卖部分功能补充】
瑞吉外卖部分功能补充 菜品的启售和停售 在浏览器控制台点击对应功能后可以看到前端发送的请求是:http://localhost:9999/dish/status/1?ids1413342036832100354,请求方式为POST。 接收到前端参数后,进行controller层代码补全,…...
react的setState做了什么
1、为什么需要setState setState的作用是帮助我们更改数据的同时并且通知视图进行渲染。因为React并不会绑定视图和state,需要我们手动去更新视图。 2、setState什么时候是同步的,什么时候是异步的 setState这个方法在调用的时候是同步的,…...
ubuntu18.04 RTX3060 rangnet++训练 bonnetal语义分割
代码链接: https://github.com/PRBonn/lidar-bonnetal 安装anaconda环境为 CUDA 11.0(11.1也可以) anaconda环境如下 numpy1.17.2 torchvision0.2.2 matplotlib2.2.3 tensorflow1.13.1 scipy0.19.1 pytorch1.7.1 vispy0.5.3 opencv_python…...
Linux:权限是什么
本篇文章来简单介绍一下Linux操作系统中权限的基本概念和一些操作方法,对Linux权限有一个基本的了解,希望对大家学习Linux有所帮助。 目录 1.权限的概念 2.Linux权限管理 2.1 文件访问者的分类 2.2 文件类型与访问权限(事物属性ÿ…...
uni-app yrkDataPicker 日期和时间选择控件
uni-app 选择日期时间控件有 2 月份有 31 天的问题,一直没有修复,uni-calendar 苹果有选择年份和月份后无法显示问题。自己写了一个,只支持 H5 和微信小程序,其他没有试过。 <template><view class"yrk-data-picke…...
PAM从入门到精通(十九)
接前一篇文章:PAM从入门到精通(十八) 本文参考: 《The Linux-PAM Application Developers Guide》 PAM 的应用开发和内部实现源码分析 先再来重温一下PAM系统架构: 更加形象的形式: 六、整体流程示例 2.…...
apache httpd 多后缀解析漏洞
形成原因 Apache HTTPD 支持一个文件拥有多个后缀,并为不同后缀执行不同的指令 在有多个后缀的情况下,只要一个文件含有.php后缀的文件即将被识别成PHP文件,没必要是最后一个后缀。利用这个特性,将会造成一个可以绕过上传白名单…...
Flutter ☞ 数据类型
数值类型 int、double、num int 整型,取值通常在 -253 ~ 253 之间 int class double 64-bt(双精度)浮点数,符合 IEEE 754 标准。 double class num 数值类型的基类,int 和 double 都继承自num。 num class 数值转换 // String -> …...
MyBatis-Plus 实战教程一
这里写目录标题 简介快速上手数据库建立创建实体类修改参数引入依赖测试常见注解介绍TableNameTableIdTableField 常见配置仓库地址 简介 MyBatis-Plus(简称 MP)是一个 MyBatis 的增强工具,在 MyBatis 的基础上只做增强不做改变,…...
闭包(函数)
把内部函数通过return扔出去 必要条件...
Go包介绍与初始化:搞清Go程序的执行次序
Go包介绍与初始化:搞清Go程序的执行次序 文章目录 Go包介绍与初始化:搞清Go程序的执行次序一、main.main 函数:Go 应用的入口函数1.1 main.main 函数1.2 main.main 函数特点 二、包介绍2.1 包介绍与声明2.2 非 main包的 main 函数2.3 包的命名…...
Python教程(15)——Python流程控制语句详解
目录 if语句else if语句for循环遍历类型range关键字 while循环break语句continue语句 Python流程控制是Python编程中非常重要的一部分,它用于控制程序的执行流程。Python提供了多种流程控制语句,包括if语句、while循环、for循环、break和continue语句等。…...
JavaScript基础知识16——分支语句
哈喽,大家好,我是雷工。 今天学习JavaScript基础知识的分支语句,以下为学习笔记。 1、程序三大流程控制语句 ○写几句就从上往下执行几句,这种叫做顺序结构; ○有时要根据条件选择执行代码,这种叫分支结构…...
web开发初级工程师学习笔记
web开发初级工程师学习笔记 前端开发工具实验1 VS Code 初体验介绍 前端开发工具 实验1 VS Code 初体验 介绍 VS Code 环境提供的是一个可以在浏览器中使用原生 VS Code 编辑代码的程序。在该环境中,你可以使用到与本地安装近乎一致的 VS Code 程序来编辑代码文件…...
后进先出(LIFO)详解
LIFO 是 Last In, First Out 的缩写,中文译为后进先出。这是一种数据结构的工作原则,类似于一摞盘子或一叠书本: 最后放进去的元素最先出来 -想象往筒状容器里放盘子: (1)你放进的最后一个盘子(…...
DockerHub与私有镜像仓库在容器化中的应用与管理
哈喽,大家好,我是左手python! Docker Hub的应用与管理 Docker Hub的基本概念与使用方法 Docker Hub是Docker官方提供的一个公共镜像仓库,用户可以在其中找到各种操作系统、软件和应用的镜像。开发者可以通过Docker Hub轻松获取所…...
云启出海,智联未来|阿里云网络「企业出海」系列客户沙龙上海站圆满落地
借阿里云中企出海大会的东风,以**「云启出海,智联未来|打造安全可靠的出海云网络引擎」为主题的阿里云企业出海客户沙龙云网络&安全专场于5.28日下午在上海顺利举办,现场吸引了来自携程、小红书、米哈游、哔哩哔哩、波克城市、…...
QMC5883L的驱动
简介 本篇文章的代码已经上传到了github上面,开源代码 作为一个电子罗盘模块,我们可以通过I2C从中获取偏航角yaw,相对于六轴陀螺仪的yaw,qmc5883l几乎不会零飘并且成本较低。 参考资料 QMC5883L磁场传感器驱动 QMC5883L磁力计…...
《从零掌握MIPI CSI-2: 协议精解与FPGA摄像头开发实战》-- CSI-2 协议详细解析 (一)
CSI-2 协议详细解析 (一) 1. CSI-2层定义(CSI-2 Layer Definitions) 分层结构 :CSI-2协议分为6层: 物理层(PHY Layer) : 定义电气特性、时钟机制和传输介质(导线&#…...
镜像里切换为普通用户
如果你登录远程虚拟机默认就是 root 用户,但你不希望用 root 权限运行 ns-3(这是对的,ns3 工具会拒绝 root),你可以按以下方法创建一个 非 root 用户账号 并切换到它运行 ns-3。 一次性解决方案:创建非 roo…...
Web 架构之 CDN 加速原理与落地实践
文章目录 一、思维导图二、正文内容(一)CDN 基础概念1. 定义2. 组成部分 (二)CDN 加速原理1. 请求路由2. 内容缓存3. 内容更新 (三)CDN 落地实践1. 选择 CDN 服务商2. 配置 CDN3. 集成到 Web 架构 …...
Typeerror: cannot read properties of undefined (reading ‘XXX‘)
最近需要在离线机器上运行软件,所以得把软件用docker打包起来,大部分功能都没问题,出了一个奇怪的事情。同样的代码,在本机上用vscode可以运行起来,但是打包之后在docker里出现了问题。使用的是dialog组件,…...
关键领域软件测试的突围之路:如何破解安全与效率的平衡难题
在数字化浪潮席卷全球的今天,软件系统已成为国家关键领域的核心战斗力。不同于普通商业软件,这些承载着国家安全使命的软件系统面临着前所未有的质量挑战——如何在确保绝对安全的前提下,实现高效测试与快速迭代?这一命题正考验着…...
springboot 日志类切面,接口成功记录日志,失败不记录
springboot 日志类切面,接口成功记录日志,失败不记录 自定义一个注解方法 import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target;/***…...
