当前位置: 首页 > news >正文

Spark大数据分析与实战笔记(第一章 Scala语言基础-2)

文章目录

  • 章节概要
  • 1.2 Scala的基础语法
    • 1.2.1 声明值和变量
    • 1.2.2 数据类型
    • 1.2.3 算术和操作符重载
    • 1.2.4 控制结构语句
    • 1.2.5 方法和函数

章节概要

Spark是专为大规模数据处理而设计的快速通用的计算引擎,它是由Scala语言开发实现的,关于大数据技术,本身就是计算数据,而Scala既有面向对象组织项目工程的能力,又具备计算数据的功能,同时Spark和Scala的紧密集成,本书将采用Scala语言开发Spark程序,所以学好Scala将有助于我们更好的掌握Spark框架。

1.2 Scala的基础语法

1.2.1 声明值和变量

Scala有两种类型的变量,一种是使用关键字var声明的变量,值是可变的;另一种是使用关键字val声明的变量,也叫常量,值是不可变的。

  • 使用关键字var声明的变量
    var myVar:String="Hello"
  • 使用关键字val声明的变量
    val age:Int=10

有以下几个事项需要注意:

  1. Scala中的变量在声明时必须进行初始化。
  2. 使用var声明的变量可以在初始化后再次对变量进行赋值;
  3. 使用val声明的常量的值不可被再次赋值。

声明变量时,我们可以不给出变量的类型,因为在初始化的时候,Scala的类型推断机制能够根据变量的初始化的值自动推算出来。

上述声明变量myVar和age的代码,等同于下列代码:

var myVar = "Hello"   //使用关键字var声明的变量val age = 10           //使用关键字val声明的变量

注:使用关键字var或val声明变量时,后面紧跟的变量名称不能和Scala中的保留字重名,而且变量名可以以字母或下划线开头,且变量名是严格区分大小写的。

1.2.2 数据类型

  • 任何一种编程语言都有特定的数据类型,Scala也不例外。
  • 与其他语言相比,Scala中的所有值都有一个类型,包括数值和函数。

Scala中数据类型的层次结构
在这里插入图片描述
从上图中可以看出,Any是所有类型的超类型,也称为顶级类型,它包含两个直接子类,具体如下:

  • AnyVal:表示值类型,值类型描述的数据是一个不为空的值,而不是一个对象。它预定义了9种类型,分别是Double、Float、Long、Int、Short、Byte、Unit、Char和Boolean。其中,Unit是一种不代表任何意义的值类型,它的作用类似Java中void。

  • AnyRef:表示引用类型。可以认为,除值以外,所有类型都继承自AnyRef。

在Scala数据类型层级结构底部,还有两个数据类型,分别是Nothing和Null,具体介绍如下:

  • Nothing:所有类型的的子类型,也称为底部类型。它觉的用途是发出终止信号,例如抛出异常、程序退出或无限循环。
  • Null:所有引用类型的子类型,它主要用途是与其他JVM语言互操作,几乎不在Scala代码中使用。

1.2.3 算术和操作符重载

Scala中算术操作符(+、-、*、/、%)的作用和Java是一样的,位操作符(&、|、>>、<<)也是一样的。特别强调的是,Scala的这些操作符其实是方法。例如,a+b其实是a.+(b)的简写。
在这里插入图片描述
注:Scala没有提供操作符++和–。如果我们想实现递增或者递减的效果,可以使用“+=1”或者“-=1”这种方式来实现。

1.2.4 控制结构语句

在Scala中,控制结构语句包括条件分支语句和循环语句。其中,条件分支语句有if语句、if…else语句、if…else if…else语句以及if…else嵌套语句;循环语句有for循环,while循环和do…while循环。

  1. 条件分支语句
  • if条件语句
if (布尔表达式){语句块
} 
  • if-else条件语句
if (布尔表达式){语句块
} else{语句块
}
  • if-else-if-else语句
if (布尔表达式1){语句块
} else if(布尔表达式2){语句块
} else if(布尔表达式3){语句块
} else {语句块
}
  • if-else嵌套语句
if (布尔表达式1){语句块if(布尔表达式2){语句块}
}else if (布尔表达式3){语句块else if (布尔表达式4){语句块}
}else{语句块
}

示例代码如下:
在这里插入图片描述
2. 循环语句
Scala中的for语句和Java中的循环语句在语法上有较大的区别,下面我们来介绍一下Scala中的for循环语句。

  • for循环语句
for(变量<-表达式/数组/集合){循环语句;
}

下面,我们通过从0循环到9,每循环一次则就将该值打印输出进行操作演示。在Scala语法中,可以使用”0 to 9”表示从0到9的范围,范围包含9,示例代码如下:

  • Dos 命令行下
    在这里插入图片描述

  • IDEA下
    在这里插入图片描述
    结果如下:
    0 1 2 3 4 5 6 7 8 9

Scala在for循环语句中可以通过使用if判断语句过滤一些元素,多个过滤条件用分号分隔开。例如,输出0-9范围中大于5的偶数,示例代码如下:
在这里插入图片描述

  • while循环语句
    Scala中的while循环语句和Java中的完全一样,语法格式如下:

  • while语句

while(布尔表达式){循环语句;
}

下面,我们通过打印输出奇数的案例来演示while的使用。

假设有一个变量x=1,判断是否小于10,如果是则打印输出,然后再进行+2运算。

示例代码如下:
在这里插入图片描述

  • do-while语句
do{循环语句;
}while(布尔表达式)

do…while循环语句与while语句的主要区别是,do…while语句的循环语句至少执行一次,示例代码如下:
在这里插入图片描述

1.2.5 方法和函数

在Scala中,它和Java一样也是拥有方法和函数。Scala的方法是类的一部分,而函数是一个对象可以赋值给一个变量。换句话来说,在类中定义的函数即是方法。

Scala中可以使用def语句和val语句定义函数,而定义方法只能使用def语句。下面分别对Scala的方法和函数进行讲解。

  1. 方法
    Scala方法的定义格式如下:
def functionName ([参数列表]):[return type]={function bodyreturn [expr]
}

下面定义一个方法add,实现两个数相加求和,示例代码下:

def add(a:Int,b:Int):Int={var sum:Int = 0sum = a + breturn sum
}

Scala的方法调用的格式如下:

//没有使用实例的对象调用格式
functionName(参数列表)//方法使用实例的对象来调用,我们可以使用类似Java的格式(“.”号)
[instance.]functionName(参数列表)

下面,在类Test中,定义一个方法addInt,实现两个整数相加求和。在这里, 我们通过“类名.方法名(参数列表)”来进行调用,示例代码如下:

scala> :paste                         # 多行输入模式的命令
// Entering paste mode (ctrl-D to finish)
object Test{
def addInt(a:Int,b:Int):Int={var sum:Int =0sum = a + breturn sum}
}
// Exiting paste mode, now interpreting. # Ctrl+d结束多行输入模式
defined object Test
scala> Test.addInt(4,5)      # 方法调用
res0: Int = 9
  1. 函数
    Scala中的函数是一个对象,可以赋值给一个变量。
    Scala函数的定义语法格式如下:
val functionName ([参数列表]):[return type]={function bodyreturn [expr]}

下面,定义一个函数addInt,实现实现两个整数相加求和,示例代码如下:

scala> val addInt =(a:Int,b:Int) => a+b
addInt: (Int, Int) => Int = <function2>
scala> addInt(6,7)
res1: Int = 13
  • 方法转换成函数
    方法转换成函数的格式如下:
val f1 = m _

在上述的格式中,方法名m后面紧跟一个空格和下划线,是为告知编译器将方法转换成函数,而不是要调用这个方法。下面,定义一个方法m,实现将方法m转成函数,示例代码如下:

scala> def m(x:Int,y:Int):Int=x*y          # 方法
m: (x: Int, y: Int)Int
scala> val f = m _
f: (Int, Int) => Int = <function2>          # 函数
scala> f(2,3)
res2: Int = 6

注:Scala方法的返回值类型可以不写,编译器可以自动推断出来,但是对于递归方法来说,必须要指定返回类型。

转载自:https://blog.csdn.net/u014727709/article/details/132031799
欢迎start,欢迎评论,欢迎指正

相关文章:

Spark大数据分析与实战笔记(第一章 Scala语言基础-2)

文章目录 章节概要1.2 Scala的基础语法1.2.1 声明值和变量1.2.2 数据类型1.2.3 算术和操作符重载1.2.4 控制结构语句1.2.5 方法和函数 章节概要 Spark是专为大规模数据处理而设计的快速通用的计算引擎&#xff0c;它是由Scala语言开发实现的&#xff0c;关于大数据技术&#xf…...

Linux 下 Mysql 的使用(Ubuntu20.04)

文章目录 一、安装二、使用2.1 登录2.2 数据库操作2.2.1 创建数据库2.2.2 删除数据库2.2.3 创建数据表 参考文档 一、安装 Linux 下 Mysql 的安装非常简单&#xff0c;一个命令即可&#xff1a; sudo apt install mysql-server检查安装是否成功&#xff0c;输入&#xff1a; …...

牛客练习赛114

A.最后有0得数肯定是10得倍数&#xff0c;然后直接排序即可 #include<bits/stdc.h> using namespace std; const int N 1e610,mod1e97; int n; void solve(){cin>>n;vector<int> a(n);for(auto&i:a) cin>>i;sort(a.begin(),a.end(),greater<&g…...

Http与Https

1.简单介绍 HTTP&#xff1a;最广泛应用的网络通信协议&#xff0c;基于TCP&#xff0c;数据传输简单高效&#xff0c;数据是明文。 HTTPS&#xff1a;是HTTP的加强版&#xff0c;是HTTPSSL。在HTTP的基础上加了安全机制&#xff0c;一方面保证数据的安全传输&#xff0c;另一…...

前端通信(渲染、http、缓存、异步、跨域)自用笔记

SSR/CSR&#xff1a;HTML拼接&#xff1f;网页源码&#xff1f;SEO/交互性 SSR &#xff08;server side render&#xff09;服务端渲染&#xff0c;是指由服务侧&#xff08;server side&#xff09;完成页面的DOM结构拼接&#xff0c;然后发送到浏览器&#xff0c;为其绑定状…...

43.227.198.x怎么检查服务器里是否中毒情况?

要检查43.227.198.1服务器是否中毒&#xff0c;可以执行以下步骤&#xff1a; 运行杀毒软件&#xff1a;运行已安装的杀毒软件进行全盘扫描&#xff0c;查看是否有病毒或恶意软件。如果发现病毒或恶意软件&#xff0c;立即将其删除或隔离。 检查系统文件&#xff1a;检查服务器…...

Sentinel dashboard无法查询到应用的限流配置问题以及解决

一。问题引入 使用sentinle-dashboard控制台 项目整体升级后&#xff0c;发现控制台上无法看到流控规则了 之前的问题是无法注册上来 现在是注册上来了。结果看不到流控规则配置了。 关于注册不上来的问题&#xff0c;可以看另一篇文章 https://blog.csdn.net/a15835774652/…...

【Spring Boot】社交网站中验证用户登录的checkUser方法

public boolean checkUser(User user) {User userInDb userRepository.findByUsername(user.getUsername());if (userInDb ! null && userInDb.getPassword().equals(user.getPassword())) {return true;} else {return false;}} } 这段代码是UserService类中的checkU…...

edge浏览器进行qq截图过保爆决过程

edge浏览器进行qq截图过保解决过程 参考&#xff1a;电脑截屏曝光特别高怎么解决&#xff1f; - 知乎 问题展示 饱和度过高&#xff0c;刺眼 1. 在chrome地址栏输入chrome://flags/ 2. 在页面的搜索栏搜索force color profile 3. 在选项中选择所对应的颜色管理。&#xff08…...

【Linux】Linux在防火墙firewall中开放或删除某端口

在生产中往往是不能关闭防火墙firewall的&#xff08;以下操作是在linux中执行的&#xff09; #补充一下查看防火墙的命令 #查看防火墙状态 systemctl status firewalld #关闭防火墙 systemctl stop firewalld #重启防火墙 systemctl restart firewalld #启动防火墙 systemctl …...

C++构造函数初始化列表

构造函数的一项重要功能是对成员变量进行初始化&#xff0c;为了达到这个目的&#xff0c;可以在构造函数的函数体中对成员变量一一赋值&#xff0c;还可以采用初始化列表。 C构造函数的初始化列表使得代码更加简洁&#xff0c;请看下面的例子&#xff1a; #include <iostre…...

c语言调用mciSendString播放音乐

如下所示&#xff0c;这是一个使用c语言调用系统方法mciSendString()&#xff0c;让系统播放音乐的示例&#xff1a; baihuaxiang 代码&#xff1a; #include <graphics.h> #include <Windows.h> #include <mmsystem.h>#pragma comment(lib,"WINMM.LIB…...

Qt:qRegisterMetaType为Qt信号和槽添加自定义参数类型

背景 qt信号和槽之间的参数传递默认只能传递qt内部已有的类型&#xff0c;例如QString等&#xff0c;若我们自定义类型作为参数时&#xff0c;虽然编译不会报错&#xff0c;但运行时会提示connect无效&#xff0c;无法识别自定义的类。 此时需要我们将自定义类进行注册&#…...

ffmpeg rtp发送video和audio并播放

发送h264 video ffmpeg -re -stream_loop -1 -i h264.mp4 -vcodec h264 -f rtp rtp://127.0.0.1:5006SDP: v0 o- 0 0 IN IP4 127.0.0.1 sNo Name cIN IP4 127.0.0.1 t0 0 atool:libavformat LIBAVFORMAT_VERSION mvideo 5006 RTP/AVP 96 artpmap:96 H264/90000 afmtp:96 packe…...

CSS打字回删效果动画源码

<!DOCTYPE html> <html lang="en"> <head><meta charset...

Vue全局后置守卫

全局后置守卫 一、在 router 目录下的 index.js 文件中配置全局后置守卫。 import Vue from vue import VueRouter from vue-router Vue.use(VueRouter)import Home from ../views/Home.vue import About from ../views/About.vue import Login from ../views/Login.vueconst…...

【Go语言】基于Socket编程的P2P通信程序示例

Go语言的Socket编程实现为开发者提供了一种高效且强大的方式来实现网络通信。通过Go语言的并发模型和内置的网络库&#xff0c;如net包&#xff0c;开发者可以轻松地创建基于套接字的通信应用。Go语言的goroutine和channel机制使并发处理变得简单&#xff0c;能够轻松处理多个连…...

16、Flink 的table api与sql之连接外部系统: 读写外部系统的连接器和格式以及Elasticsearch示例(2)

Flink 系列文章 1、Flink 部署、概念介绍、source、transformation、sink使用示例、四大基石介绍和示例等系列综合文章链接 13、Flink 的table api与sql的基本概念、通用api介绍及入门示例 14、Flink 的table api与sql之数据类型: 内置数据类型以及它们的属性 15、Flink 的ta…...

Java代码优化案例2:使用HashMap代替List进行数据查找

在开发过程中&#xff0c;我们经常需要在一个集合中查找某个元素。一种常见的做法是使用List来存储数据&#xff0c;然后通过循环遍历List来查找目标元素。然而&#xff0c;当数据量较大时&#xff0c;这种做法效率较低。我们可以通过使用HashMap来优这个过程。 1. 原始代码实…...

每天一道leetcode:542. 01 矩阵(图论中等广度优先遍历)

今日份题目&#xff1a; 给定一个由 0 和 1 组成的矩阵 mat &#xff0c;请输出一个大小相同的矩阵&#xff0c;其中每一个格子是 mat 中对应位置元素到最近的 0 的距离。 两个相邻元素间的距离为 1 。 示例1 输入&#xff1a;mat [[0,0,0],[0,1,0],[0,0,0]] 输出&#xff…...

应用升级/灾备测试时使用guarantee 闪回点迅速回退

1.场景 应用要升级,当升级失败时,数据库回退到升级前. 要测试系统,测试完成后,数据库要回退到测试前。 相对于RMAN恢复需要很长时间&#xff0c; 数据库闪回只需要几分钟。 2.技术实现 数据库设置 2个db_recovery参数 创建guarantee闪回点&#xff0c;不需要开启数据库闪回。…...

8k长序列建模,蛋白质语言模型Prot42仅利用目标蛋白序列即可生成高亲和力结合剂

蛋白质结合剂&#xff08;如抗体、抑制肽&#xff09;在疾病诊断、成像分析及靶向药物递送等关键场景中发挥着不可替代的作用。传统上&#xff0c;高特异性蛋白质结合剂的开发高度依赖噬菌体展示、定向进化等实验技术&#xff0c;但这类方法普遍面临资源消耗巨大、研发周期冗长…...

UE5 学习系列(三)创建和移动物体

这篇博客是该系列的第三篇&#xff0c;是在之前两篇博客的基础上展开&#xff0c;主要介绍如何在操作界面中创建和拖动物体&#xff0c;这篇博客跟随的视频链接如下&#xff1a; B 站视频&#xff1a;s03-创建和移动物体 如果你不打算开之前的博客并且对UE5 比较熟的话按照以…...

1688商品列表API与其他数据源的对接思路

将1688商品列表API与其他数据源对接时&#xff0c;需结合业务场景设计数据流转链路&#xff0c;重点关注数据格式兼容性、接口调用频率控制及数据一致性维护。以下是具体对接思路及关键技术点&#xff1a; 一、核心对接场景与目标 商品数据同步 场景&#xff1a;将1688商品信息…...

解决本地部署 SmolVLM2 大语言模型运行 flash-attn 报错

出现的问题 安装 flash-attn 会一直卡在 build 那一步或者运行报错 解决办法 是因为你安装的 flash-attn 版本没有对应上&#xff0c;所以报错&#xff0c;到 https://github.com/Dao-AILab/flash-attention/releases 下载对应版本&#xff0c;cu、torch、cp 的版本一定要对…...

项目部署到Linux上时遇到的错误(Redis,MySQL,无法正确连接,地址占用问题)

Redis无法正确连接 在运行jar包时出现了这样的错误 查询得知问题核心在于Redis连接失败&#xff0c;具体原因是客户端发送了密码认证请求&#xff0c;但Redis服务器未设置密码 1.为Redis设置密码&#xff08;匹配客户端配置&#xff09; 步骤&#xff1a; 1&#xff09;.修…...

MySQL账号权限管理指南:安全创建账户与精细授权技巧

在MySQL数据库管理中&#xff0c;合理创建用户账号并分配精确权限是保障数据安全的核心环节。直接使用root账号进行所有操作不仅危险且难以审计操作行为。今天我们来全面解析MySQL账号创建与权限分配的专业方法。 一、为何需要创建独立账号&#xff1f; 最小权限原则&#xf…...

安卓基础(aar)

重新设置java21的环境&#xff0c;临时设置 $env:JAVA_HOME "D:\Android Studio\jbr" 查看当前环境变量 JAVA_HOME 的值 echo $env:JAVA_HOME 构建ARR文件 ./gradlew :private-lib:assembleRelease 目录是这样的&#xff1a; MyApp/ ├── app/ …...

基于 TAPD 进行项目管理

起因 自己写了个小工具&#xff0c;仓库用的Github。之前在用markdown进行需求管理&#xff0c;现在随着功能的增加&#xff0c;感觉有点难以管理了&#xff0c;所以用TAPD这个工具进行需求、Bug管理。 操作流程 注册 TAPD&#xff0c;需要提供一个企业名新建一个项目&#…...

使用Spring AI和MCP协议构建图片搜索服务

目录 使用Spring AI和MCP协议构建图片搜索服务 引言 技术栈概览 项目架构设计 架构图 服务端开发 1. 创建Spring Boot项目 2. 实现图片搜索工具 3. 配置传输模式 Stdio模式&#xff08;本地调用&#xff09; SSE模式&#xff08;远程调用&#xff09; 4. 注册工具提…...