




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
Scala基础智能手机给人们的生活提供了便利,但也可能会给人们造成困扰。对于陌生号码的未接来电,用户拨打回去可能需要支付长途费用,甚至该号码有可能是诈骗分子的。合理使用大数据技术,能够大幅提高诈骗电话识别率,为构建和谐社会提供助力。对于陌生号码的未接来电,用户其实可以查询该号码的归属地,我国的手机号码一般分为3种类型,即中国移动、中国联通和中国电信。每一个手机号码都有固定的分布区域,这个区域即归属地。无论号码被多少人注册或注销过,其归属地都是不变的。在本次任务中,用户可以查询未接来电的归属地。如果未接来电号码的归属地是亲朋好友所在的城市,那么来电有可能是熟人的电话,可以拨打回去;如果不是,拨打回去则要做一定的诈骗防范措施。任务背景一般情况下,知道手机号码的前7位数字即可查询到归属地。现有一份2020phonelocation.txt文件记录了某个年份我国的手机号码段及其归属地等相关信息,包含7个数据字段,分别为编号、号码段、省份、市、号码类型、区号和邮编,如下表。通过这份文件的数据可以查询特定手机号码的类型,统计某个地区的号码段个数,查询某个地区的所有号码段或查询手机号码的归属地等。本章将首先介绍Scala语言及其特性,并简要介绍Scala在不同系统下的安装、配置过程,接着介绍Scala中的数据类型,并详细介绍Scala的常量、变量、函数、if判断、for循环等内容,结合手机号码归属地查询实例,编写Scala程序查询手机号码归属地等基本信息。任务背景1,1300000,山东,济南,中国联通,0531,2500002,1300001,江苏,常州,中国联通,0519,2130003,1300002,安徽,巢湖,中国联通,0565,2380004,1300003,四川,宜宾,中国联通,0831,6440005,1300004,四川,自贡,中国联通,0813,6430001定义函数识别号码类型目录安装与运行Scala2统计广州号码段数量3根据归属地对手机号码段进行分组4编写手机号码归属地信息查询程序5Scala是Spark编程常用的语言之一,本书进行Spark编程时使用的语言也是Scala。因此,在学习Spark之前,需要先了解Scala语言、Scala安装过程和基础编程操作。本节的任务如下。了解Scala语言及其特性并安装Scala,为后续Scala程序提供运行环境。任务描述Scala是ScalableLanguage的缩写,是一种多范式的编程语言,由洛桑联邦理工学院的马丁·奥德斯在2001年基于Funnel的工作开始设计,设计初衷是想集成面向对象编程和函数式编程的各种特性。Scala是一种纯粹的面向对象的语言,每个值都是对象。Scala也是一种函数式语言,因此函数可以当成值使用。由于Scala整合了面向对象编程和函数式编程的特性,因此Scala相对于Java、C#、C++等其他语言更加简洁。Scala源代码会被编译成Java字节码,因此Scala可以运行于Java虚拟机(JavaVirtualMachine,JVM)之上,并可以调用现有的Java类库。了解Scala语言面向对象函数式编程静态类型可扩展了解Scala特性通过浏览器查找Scastie并进入,即可进入Scala在线运行环境。进入Scastie界面后,在上窗格中输入“println("helloworld")”。单击“Run”按钮,输出信息将显示在下窗格中,如下图。安装Scala1.在网页上运行ScalaScala运行环境众多,可以运行在Windows、Linux、macOS等系统上。Scala是运行在JVM上的语言,因此必须确保系统环境中安装了JDK,即Java开发工具包,而且必须确保JDK版本与本书安装的Spark的JDK编译版本一致,本书中使用的JDK是JDK8(Java1.8)。查看Java版本安装Scala2.Scala环境设置(1)在Linux和macOS系统上安装Scala从Scala官网下载Scala安装包,安装包名称为“scala-2.12.15.tgz”将其上传至/opt目录解压安装包至/usr/local目录下配置Scala环境变量安装Scala3.Scala安装(2)在Windows系统上安装Scala从Scala官网下载Scala安装包,安装包名称为“scala.msi”。双击scala.msi安装包,开始安装软件。进入欢迎界面,单击右下角的“Next”按钮后出现许可协议选择提示框,选择接受许可协议中的条款并单击右下角的“Next”按钮。安装Scala3.Scala安装选择安装路径,本文Scala的安装路径选择在非系统盘的“D:\ProgramFiles(x86)\spark\scala\”,单击“OK”按钮进入安装界面。安装Scala(2)在Windows系统上安装Scala在安装界面中单击右下角的“Install”按钮进行安装,安装完成时单击“Finish”按钮完成安装。右键单击“此电脑”图标,选择“属性”选项,在弹出的窗口中选择“高级系统设置”选项。在弹出的对话框中选择“高级”选项卡,并单击“环境变量”按钮,在环境变量对话框中,选择“Path”变量并单击“编辑”按钮,在Path变量中添加Scala安装目录的bin文件夹所在路径,如“D:\ProgramFiles(x86)\spark\scala\bin”。安装Scala(2)在Windows系统上安装Scala运行ScalaScala解释器也称为REPL(Read-Evaluate-Print-Loop,读取-执行-输出-循环)。在命令行中输入“scala”,即可进入REPL,如下图。REPL是一个交互式界面,用户输入命令时,可立即产生交互反馈。输入“:quit”命令即可退出REPL,如下图。运行Scala右图是一个Scala类,该类实现了两个数相加的方法。。如果要使用该方法,那么需要通过import加载该方法,如左图,其中,add是类名,addInt是方法名。1定义函数识别号码类型目录安装与运行Scala2统计广州号码段数量3根据归属地对手机号码段进行分组4编写手机号码归属地信息查询程序5中国移动、中国联通和中国电信这3种类型的手机号码都有特定的手机号码段。中国移动的手机号码段有1340~1348、135~139、150~152、157~159、182~184、187、188、178、147、1705等;中国联通的手机号码段有130~132、155、156、185、186、176、145、1709等;中国电信的手机号码段有133、1349、153、180、181、189、1700、177等。本节的任务如下。使用数组分别存储不同类型的手机号码段,并编写函数用于识别某个手机号码段的类型。任务描述Scala常用数据类型了解数据类型数据类型描述Int32位有符号补码整数。数值区间为−32768~32767Float32位IEEE754(IEEE浮点数算术标准)单精度浮点数Double64位IEEE754(IEEE浮点数算术标准)双精度浮点数String字符序列,即字符串Boolean布尔值,true或falseUnit表示无值,作用与Java中的void一样,是不返回任何结果的方法的结果类型。Unit只有一个实例值,写成()Scala会区分不同类型的值,并且会基于使用值的方式确定最终结果的数据类型,这称为类型推断。Scala使用类型推断可以确定混合使用数据类型时最终结果的数据类型。如在加法中混用Int和Double类型时,Scala将确定最终结果为Double类型,如下图。了解数据类型常量在程序运行过程中值不会发生变化的量为常量或值,常量通过val关键字定义,常量一旦定义就不可更改,即不能对常量进行重新计算或重新赋值。定义一个常量的语法格式如下。valname:type=initialization变量变量是在程序运行过程中值可能发生改变的量。变量使用关键字var定义。与常量不同的是,变量定义之后可以重新被赋值。定义一个变量的语法格式如下。varname:type=initialization定义与使用常量、变量使用运算符
运算符意义示例算术运算符+两个数相加1+2或1.+(2)−两个数相减1−2或1.−(2)*两个数相乘1*2或1.*(2)/两个数相除1/2或1./(2)%两个数取余1%2或1.%(2)关系运算符>
判断左值是否大于右值,是则结果为真,否则结果为假1>2或1.>(2)<
判断左值是否小于右值,是则结果为真,否则结果为假1<2或1.<(2)>=判断左值是否大于等于右值,是则结果为真,否则结果为假1>=2或1.>=(2)<=判断左值是否小于等于右值,是则结果为真,否则结果为假1<=2或1.<=(2)==判断左值是否等于右值,是则结果为真,否则结果为假1==2或1.==(2)!=判断左值是否不等于右值,是则结果为真,否则结果为假1!=2或1.!=(2)使用运算符
运算符意义示例逻辑运算符&&若两个条件成立则结果为真,否则结果为假1>2&&2>3或1>2.&&(2>3)||若两个条件有一个成立则结果为真,否则结果为假1>2||2>3或1>2.||(2>3)!对当前结果取反!(1>2)位运算符&参加运算的两个数据,按二进制位进行&运算,两位同时结果为1结果才为1,否则为00&1或0.&(1)|参加运算的两个数据,按二进制位进行|运算,两位只要有一个为1则结果为10|1或0.|(1)^参加运算的两个数据,按二进制位进行^运算,两位不同时结果为1,相同时结果为00^1或0.^(1)使用运算符
运算符意义示例赋值运算符=将右侧的值赋于左侧vala=2+=执行加法后再赋值左侧a+=2−=执行减法后再赋值左侧a
=1*=执行乘法后再赋值左侧a*=2/=执行除法后再赋值左侧a/=3%=执行取余后再赋值左侧a%=5<<=左移位后赋值左侧a<<=2>>=右移位后赋值左侧a>>=2&=按位&运算后赋值左侧a&=2|=按位|运算后赋值左侧a|=2^=按位^运算后赋值左侧a^=2数组是Scala中常用的一种数据结构,数组是一种存储了相同类型元素的固定大小的顺序集合。Scala定义一个数组的语法格式如下。#第1种方式vararr:Array[String]=newArray[String](num)#第2种方式vararr:Array[String]=Array(元素1,元素2,…)定义与使用数组数组常用的方法定义与使用数组方法描述length返回数组的长度head查看数组的第一个元素tail查看数组中除了第一个元素外的其他元素isEmpty判断数组是否为空contains(x)判断数组是否包含元素x数组的使用Scala可以使用range()方法创建区间数组。使用range()方法前同样需要先通过命令“importArray._”导入包。定义与使用数组函数是Scala的重要组成部分,Scala作为支持函数式编程的语言,可以将函数作为对象.定义函数的语法格式如下。deffunctionName(参数列表):[returntype]={}Scala提供了多种不同的函数调用方式,以下是调用函数的标准格式。functionName(参数列表)如果函数定义在一个类中,那么可以通过“类名.方法名(参数列表)”的方式调用。定义与使用函数匿名函数即在定义函数时不给出函数名的函数。Scala中匿名函数是使用箭头“=>”定义的,箭头的左边是参数列表,箭头的右边是表达式,表达式将产生函数的结果。通常可以将匿名函数赋值给一个常量或变量,再通过常量名或变量名调用该函数。若函数中的每个参数在函数中最多只出现一次,则可以使用占位符“_”代替参数。定义与使用函数1.匿名函数高阶函数指的是操作其他函数的函数。高阶函数可以将函数作为参数,也可以将函数作为返回值。高阶函数经常将只需要执行一次的函数定义为匿名函数并作为参数。一般情况下,匿名函数的定义是“参数列表=>表达式”。由于匿名参数具有参数推断的特性,即推断参数的数据类型,或根据表达式的计算结果推断返回结果的数据类型,因此定义高阶函数并使用匿名函数作为参数时,可以简化匿名函数的写法。定义与使用函数2.高阶函数—函数作为参数高阶函数可以产生新的函数,并将新的函数作为返回值。定义高阶函数计算矩形的周长,该函数传入一个Double类型的值作为参数,返回以一个Double类型的值作为参数的函数,如下图。定义与使用函数3.高阶函数—函数作为返回值函数柯里化是指将接收多个参数的函数变换成接收单一参数(最初函数的第一个参数)的函数,新的函数返回一个以原函数余下的参数为参数的函数。定义两个整数相加的函数,一般函数的写法及其调用方式如下图。使用函数柯里化定义与使用函数4.函数柯里化实现手机号码类型识别,首先用数组存储各种类型的手机号码段,并编写一个函数识别手机号码类型。用数组分别存储各种类型的手机号码段。定义一个函数identify识别手机号码段,并使用该函数查询手机号码段为133的手机号码类型。任务实现1定义函数识别号码类型目录安装与运行Scala2统计广州号码段数量3根据归属地对手机号码段进行分组4编写手机号码归属地信息查询程序5手机号码都有特定的归属地,因此可以通过手机号码段的归属地统计某个地区的手机号码段数量。某个地区的号码段数量从某种意义上可以反映出该地区的人流量,该地区的手机号码段数量大,说明该地区的人流量也大。而人流量大的地区一般都是较为繁华的地区,因此统计某个地区的号码段数量从某个角度也可以反映该地区的繁华程度。本节的任务如下。以广东地区的手机号码为例,统计广州号码段的数量。任务描述在实际业务中,经常需要对数据进行过滤处理,使用if判断即可满足这个需求。Scala中的if判断根据复杂程度可分为if语句、if…else语句、if…elseif…else语句、if…else嵌套语句,语法格式如下。#if语句if(布尔表达式){若布尔表达式为true,则执行该语句块}#if…else语句if(布尔表达式){若布尔表达式为true,则执行该语句块}else{若布尔表达式为false,则执行该语句块}使用if判断#if…elseif…else语句if(布尔表达式1){
若布尔表达式1为true,则执行该语句块}elseif(布尔表达式2){
若布尔表达式2为true,则执行该语句块}elseif(布尔表达式3){
若布尔表达式3为true,则执行该语句块}else{
若以上布尔表达式都为false,则执行该语句块使用if判断#if…else嵌套语句if(布尔表达式1){if(布尔表达式2){若布尔表达式2为true,则执行该语句块
}elseif(布尔表达式3){若布尔表达式3为true,则执行该语句块
}else{若布尔表达式2为false且布尔表达式3为false,则执行该语句块
}}else{若以上条件都为false,则执行该语句块}使用if判断循环是指在某种条件下将一段代码按顺序重复执行。在Scala中有3种循环结构,分别为while循环、do…while循环和for循环。for循环是相对较为常用的一种循环,for循环语法格式如下。for(变量<-集合){循环语句}多重循环是常见的for循环,多重循环也称为for循环嵌套,是指在两个或多个区间内循环反复,多个循环区间用分号隔开。Scala可以在for循环中使用if判断过滤一些元素,多个过滤条件用分号隔开。使用for循环for循环使用yield可以将返回值作为一个变量存储,语法格式如下。varretVar=for(varx<-List;ifcondition1;ifcondition2…)yieldxretVar是变量名,for关键字后的括号用于指明变量和条件,而yield会将每一次循环得到的返回值保存在一个集合中,循环结束后将返回该集合,并赋值给变量retVar。使用yield对1~10的偶数进行记录,并保存至变量even中,如下图。使用for循环本小节还没有介绍使用Scala读取文件的方法,因此要实现广州号码段数量的统计可以先从原始数据中取出部分数据进行测试。定义函数count(area:String)统计广州号码段数量,首先使用一个数组存储数据,初始化sum为0,再遍历该数组,判断数组中的元素是否包含参数area,若是则sum加1。调用并执行count(“广州”)函数,结果如下图。任务实现1定义函数识别号码类型目录安装与运行Scala2统计广州号码段数量3根据归属地对手机号码段进行分组4编写手机号码归属地信息查询程序5本节的任务是筛选某个地区的所有手机号码段。首先需要根据地区对手机号码段进行分组。再根据地区取出该分组内的所有手机号码段。任务描述Scala的列表(List)与数组非常相似,列表的所有元素都具有相同的类型。与数组不同的是,列表是不可变的,即列表的元素不能通过赋值进行更改。定义列表时,需要写明列表元素的数据类型,或者根据列表初值类型自动推断。具有类型T的元素的列表类型可写为List[T]。构造列表的两个基本单位是“Nil”和“::”。“Nil”可以表示空列表;“::”称为中缀操作符,表示列表从前端扩展,遵循右结合。定义与使用列表列表操作常用方法定义与使用列表方法描述defhead:A获取列表的第一个元素definit:List[A]返回所有元素,除了最后一个元素deflast:A获取列表的最后一个元素deftail:List[A]返回所有元素,除了第一个元素def:::(prefix:List[A]):List[A]在列表开头添加指定列表的元素deftake(n:Int):List[A]获取列表前n个元素defcontains(elem:Any):Boolean判断列表是否包含指定元素Scala中常用的查看列表元素的方法有head、init、last、tail和take()。head:查看列表的第一个元素。tail:查看第一个元素之后的其余元素。last:查看列表的最后一个元素。Init:查看除最后一个元素外的所有元素。take():查看列表前n个元素。定义与使用列表如果需要合并两个列表,那么可以使用:::()。但需要注意,“列表1:::列表2”与“列表1.:::(列表2)”的结果是不一样的,对于前者,列表2的元素添加在列表1的后面;对于后者,列表2的元素添加在列表1的前面。合并两个列表还可以使用concat()方法。用户可以使用contains()方法判断列表中是否包含某个元素,若列表中存在指定的元素则返回true,否则返回false。定义与使用列表ScalaSet(集合)是没有重复的对象集合,所有的元素都是唯一的。集合操作常用方法Scala合并两个列表时使用的是:::()或concat()方法,而合并两个集合使用的是++()方法。定义与使用集合方法描述defhead:A获取集合的第一个元素definit:Set[A]返回所有元素,除了最后一个deflast:A获取集合的最后一个元素deftail:Set[A]返回所有元素,除了第一个def++(elems:A):Set[A]合并两个集合deftake(n:Int):List[A]获取列表前n个元素defcontains(elem:Any):Boolean判断集合中是否包含指定元素映射(Map)是一种可迭代的键值对结构。所有的值都可以通过键来获取,并且映射中的键都是唯一的。集合操作常用方法同样也适合映射。另外映射还可以通过keys方法获取所有的键,通过values方法获取所有值,也可以通过isEmpty方法判断映射的数据是否为空定义与使用映射元组(Tuple)是一种类似于列表的结构,但与列表不同的是,元组可以包含不同类型的元素。元组的值是通过将单个的值包含在圆括号中构成的。目前,Scala支持的元组最大长度为22,即Scala元组最多只能包含22个元素。访问元组元素可以通过“元组名称._元素索引”进行,索引从1开始。定义与使用元组map()方法可通过一个函数重新计算列表中的所有元素,并且返回一个包含相同数目元素的新列表。foreach()方法和map()方法类似,但是foreach()方法没有返回值,只用于对参数的结果进行输出。用函数组合器filter()方法可以移除传入函数的返回值为false的元素。flatten()方法可以将嵌套的结构展开,即flatten()方法可以将一个二维的列表展开成一个一维的列表。用函数组合器flatMap()方法结合了map()方法和flatten()方法的功能,接收一个可以处理嵌套列表的函数,再对返回结果进行连接。groupBy()方法可对集合中的元素进行分组操作,返回的结果是一个映射。用函数组合器实现根据归属地对手机号码段进行分组,需要先将数据存储至列表中,使用groupBy()方法对列表中的元素进行分组。从原始数据中抽取4条数据,并存放至列表phone中,使用groupBy()方法根据归属地对列表中的元素进行分组。任务实现1定义函数识别号码类型目录安装与运行Scala2统计广州号码段数量3根据归属地对手机号码段进行分组4编写手机号码归属地信息查询程序5前面三节只抽取了部分数据进行操作,本节的任务如下。读取文件中的所有数据。根据完整数据编写手机号码归属地信息查询程序。任务描述Scala是一种纯粹的面向对象语言,面向对象语言有两个重要的概念:类和对象。其中,类是对象的抽象,也可以把类理解为模板,对象才是真正的实体。一般定义类的格式如下。classClassName(参数列表)extendst{}一个Scala源文件中可以有多个类,并且Scala类可以有参数。一般,Scala类名的第一个字母需要大写,如果需要使用几个单词构成一个类的名称,那么每个单词的第一个字母都要大写。与Java等其他语言不同的是,Scala中的类不定义为public。定义Scala类Scala类继承一个类时需要使用关键字extends。Scala只允许继承一个父类,并且继承父类的所有属性和方法。子类继承父类中已经实现的方法时,需要使用override关键字,子类继承父类中未实现的方法时,可以不用override关键字。定义Scala类Scala中没有static关键字,因此Scala的类中不存在静态成员。但是Scala可以使用object关键字实现单例模式。Scala中使用单例模式时需要使用object定义一个单例对象(object对象),单例对象在整个程序中只有一个实例。单例对象与类的区别在于单例对象不能带参数。定义单例对象的语法如下。objectObjectName{}使用Scal
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 房产渠道经理年终总结
- 安徽省宿州市宿城第一中学2025届高三第六次模拟考试化学试卷含解析
- 2025届云南省楚雄州双柏县一中高三适应性调研考试化学试题含解析
- 小学下学期课件
- 2025年大中型计算机项目构思建设方案
- 2025年金属粉末:铜粉系列项目建设方案
- 2025年发热管项目建设总纲及方案
- 陕西艺术职业学院《高等环境生物学》2023-2024学年第二学期期末试卷
- 陕西警官职业学院《贴图绘制》2023-2024学年第一学期期末试卷
- 陕西铁路工程职业技术学院《巴蜀艺术鉴赏》2023-2024学年第二学期期末试卷
- 创新者的窘境读书课件
- 2019五年级必背古诗诵读PPT
- 新概念英语第一册单词表默写模板仅中文可打印
- 2023年北京市中西医结合医院招聘医学类专业人才考试历年高频考点试题含答案解析
- 四年级下册数学第1~3单元测试卷
- CB/T 3595-1994不锈钢酸洗钝化膏
- 肝移植手术的麻醉课件
- 锅炉专项应急演练记录
- 研究思路图模板
- 氩气净化机使用说明书
- 新北师大版七年级下册数学(全册知识点考点梳理、重点题型分类巩固练习)(提高版)(家教、补习、复习用)
评论
0/150
提交评论