《Spark编程基础(Scala版第2版)》 课件 第1-5章-大数据技术概述- RDD编程_第1页
《Spark编程基础(Scala版第2版)》 课件 第1-5章-大数据技术概述- RDD编程_第2页
《Spark编程基础(Scala版第2版)》 课件 第1-5章-大数据技术概述- RDD编程_第3页
《Spark编程基础(Scala版第2版)》 课件 第1-5章-大数据技术概述- RDD编程_第4页
《Spark编程基础(Scala版第2版)》 课件 第1-5章-大数据技术概述- RDD编程_第5页
已阅读5页,还剩841页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

教材简介《Spark编程基础(Scala版,第2版)》林子雨,赖永炫,陶继平

编著,人民邮电出版社

ISBN:978-7-115-59501-0

教材官网:/post/spark2/本书以Scala作为开发Spark应用程序的编程语言,系统介绍了Spark编程的基础知识。全书共9章,内容包括:大数据技术概述Scala语言基础Spark的设计与运行原理Spark环境搭建和使用方法RDD编程SparkSQLSparkStreamingSparkMLlib本书每个章节都安排了入门级的编程实践操作,以便读者更好地学习和掌握Spark编程方法。本书官网免费提供了全套的在线教学资源,包括讲义PPT、习题、源代码、软件、数据集、授课视频、上机实验指南等。披荆斩棘在大数据丛林中开辟学习捷径填沟削坎为快速学习Spark技术铺平道路深入浅出有效降低Spark技术学习门槛资源全面构建全方位一站式在线服务体系大数据技术概述第1章目

录01大数据概念与关键技术02代表性大数据技术03编程语言的选择大数据概念1.1.1大数据概念VARIETYVELOCITYVALUEVOLUME大量化快速化多样化价值密度低4VVOLUME数据量大大量化1.1.1大数据概念人类社会数据每年50%的速度,每两年就增长一倍根据IDC发布报告1.1.1大数据概念人类在最近两年产生的数据量相当于之前产生的全部数据量数据量大1.1.1大数据概念数据存储单位之间的换算关系单位换算关系Byte(字节)1Byte=8bitKB(Kilobyte,千字节)1KB=1024ByteMB(Megabyte,兆字节)1MB=1024KBGB(Gigabyte,吉字节)1GB=1024MBTB(Trillionbyte,太字节)1TB=1024GBPB(Petabyte,拍字节)1PB=1024TBEB(Exabyte,艾字节)1EB=1024PBZB(Zettabyte,泽字节)1ZB=1024EB1.1.1大数据概念数据类型繁多VARIETY多样化1.1.1大数据概念10%结构化数据非结构化数据90%存储于关系型数据库中存储于非关系型数据库中大数据90%1.1.1大数据概念数据类型繁多基因组-LHC加速器-地球与空间探测--查询日志/点击流-Twitter/Blog/SNS-Wiki科学研究企业应用Web1.0数据Web2.0数据-交易记录-应用日志-Email、文档、文件文本-图像-视频-1.1.1大数据概念不同类型的数据1.1.1大数据概念VELOCITY快速化处理速度快1.1.1大数据概念一秒定律

从数据生成到决策响应仅需1秒2万次4.7万次6万次30万次90万次1秒定律1.1.1大数据概念价值密度低VALUE价值密度低有价值的数据海量数据1.1.1大数据概念价值密度低商业价值高1.1.1大数据概念大数据关键技术1.1.2大数据关键技术数据采集数据存储与管理数据处理与分析数据隐私与安全1.1.2大数据关键技术数据源中的数据临时中间层数据仓库或数据集市ETL工具加

载数据采集1.1.2大数据关键技术数据存储和管理云数据库NoSQL数据库分布式文件系统数据仓库关系数据库数据存储和管理1.1.2大数据关键技术数据处理与分析分布式并行编程模型机器学习数据挖掘算法实现对海量数据的处理和分析1.1.2大数据关键技术数据可视化对分析结果进行可视化呈现,帮助人们更好地理解数据、分析数据1.1.2大数据关键技术数据隐私和安全隐私数据保护体系数据安全保护体系1.1.2大数据关键技术数据存储与管理数据处理与分析大数据1.1.2大数据关键技术分布式存储分布式处理GFS\HDFSBigTable\HBaseNoSQLNewSQLMapReduceSparkFlink大数据1.1.2大数据关键技术大数据计算模式解决问题代表产品批处理计算针对大规模数据的批量处理MapReduce、Spark等流计算针对流数据的实时计算Flink、Storm、S4、Flume、Streams、Puma、DStream、SuperMario、银河流数据处理平台等图计算针对大规模图结构数据的处理Pregel、GraphX、Giraph、PowerGraph、Hama、GoldenOrb等查询分析计算大规模数据的存储管理和查询分析Dremel、Hive、Cassandra、Impala等大数据计算模式及其代表产品Hadoop1.2.1

Hadoop图Hadoop生态系统1.2.1

HadoopReduceMapMapReduce1.2.1

Hadoop编程容易,不需要掌握分布式并行编程细节1.2.1

Hadoop分而治之图MapReduce工作流程1.2.1

HadoopYARN实现“一个集群多个框架”1.2.1

Hadoop应用场景1企业应用场景2计算框架1计算框架2……业务……1.2.1

HadoopMapReduceImpalaStormSpark离线批处理实时交互式查询分析流式数据实时分析迭代计算1.2.1

HadoopMapReduceImpalaStormSpark不同的开发团队1.2.1

HadoopMapReduceImpalaStormSpark集群资源利用率低数据无法共享维护代价高1.2.1

Hadoop……StormImpalaHBase……Spark1.2.1

Hadoop……YARN资源调度管理框架StormImpalaHBase……Spark1.2.1

Hadoop各种计算框架图

在YARN上部署各种计算框架1.2.1

Hadoop图

在YARN上部署各种计算框架共享底层存储Spark1.2.2

SparkSparkCoreSparkSQLSparkStreamingMLlibGraphXSpark架构图完成RDD应用开发1.2.2

SparkSpark生态系统1.2.2

SparkVSSparkHadoopMapReduce1.2.2

SparkHadoopSpark缺点表达能力有限磁盘IO开销大延迟高1.2.2

Spark延迟高任务任务涉及IO开销1.2.2

Spark延迟高1.2.2

Spark延迟高HadoopMapReduce执行流程1.2.2

SparkSpark编程模型更灵活多种数据集操作类型提供了内存计算基于DAG的任务调度执行机制优点1.2.2

SparkHadoopMapReduce执行流程Spark

执行流程1.2.2

Spark图

Hadoop与Spark执行逻辑斯谛回归的时间对比1.2.2

SparkQ1???Spark会取代Hadoop吗?1.2.2

SparkHadoopHDFSMapReduceSpark取代1.2.2

SparkHadoopHDFSSparkHBase

数据的计算

数据的存储Flink1.2.3FlinkFlink架构图1.2.3Flink0102030405都可以获得较好的实时计算性能都支持类似SQL的编程接口都是用函数式编程模式都有完善的错误恢复机制都支持“精确一次”的语义一致性基于内存的计算框架批处理和流处理APl转换操作错误恢复机制语义一致性Flink和Spark共同点1.2.3FlinkFlink和Spark在API方面的比较APISparkFlink底层APIRDDProcessFunction核心APIDataFrame/DataSetDataStream/DataSetSQLSparkSQLTableAPI&SQL机器学习MLlibFlinkML图计算GraphXGelly其他FlinkCEP1.2.3Flink

Flink

Spark

在支持语言方面的比较支持语言SparkFlinkJava√√Scala√√Python√√R√第三方SQL√√1.2.3Flink

Flink

Spark

在部署环境方面的比较部署环境SparkFlinkLocal(SingleJVM)√√StandaloneCluster√√YARN√√Mesos√√Kubernetes√√1.2.3Flink二者区别Spark基于批来模拟流的计算Flink是基于流计算来模拟批计算技术理念Flink是一条一条地处理数据Spark是基于RDD的小批量处理流计算处理方式Flink性能略好于Spark,Flink支持增量迭代,具有对迭代进行自动优化的功能在HadoopYARN上运行Beam1.2.4

Beam一统天下?1.2.4

Beam编程接口1.2.4

Beam编程语言选择1.3编程语言的选择R语言数据建模统计分析可视化1.3编程语言的选择Python是目前国内外很多大学里流行的入门语言,学习门槛低,简单易用1.3编程语言的选择最热门的编程语言适合庞大的应用系统1.3编程语言的选择Scala是一门类似Java的多范式语言,它整合了面向对象编程和函数式编程的最佳特性1.3编程语言的选择具备强大的并发性Scala兼容JavaScala代码简洁优雅Scala支持高效的交互式编程Scala是Spark的开发语言1.3编程语言的选择原生接口数据分析接口SparkRPySpark1.3编程语言的选择Q1???开发Spark程序使用什么编程语言?1.3编程语言的选择开发Spark应用程序ScalaPythonJavaR语言1.3编程语言的选择0102在并发性能上Scala明显优于Python,Scala是静态类型,可以在编译阶段就抛出错误,便于开发大型大数据项目,此外,Scala兼容Java,运行在JVM上,可用Java中的HadoopAPI和Hadoop进行交互,但Python与Hadoop间的交互通常需要第三方库Python语言并发性能不好在大数据应用场景中,不太适合使用Java,因为完成同样的任务,Scala只需要一行代码,而Java则可能需要10行代码;Scala语言可支持交互式编程,大大提高了程序开发效率,而Java不支持交互式执行,必须编译以后运行Java代码太繁琐谢谢!Scala语言基础第2章目

录01Scala语言概述02Scala基础知识03面向对象编程基础04函数式编程基础Scala语言概述2.1.1计算机的缘起人类社会超级计算装置?阿隆佐•邱奇设计了λ演算用于研究函数定义、函数应用、递归的形式系统2.1.1计算机的缘起可计算的函数表达求值λ

演算2.1.1计算机的缘起一个形式系统计算机不能真正实现λ

演算2.1.1计算机的缘起英国数学家阿兰·图灵图灵机2.1.1计算机的缘起λ演算图灵机λ

演算计算能力2.1.1计算机的缘起阿隆佐•邱奇阿兰·图灵学习编程语言和计算机2.1.1计算机的缘起将图灵的理论物化成为实际的物理实体,成为了计算机体系结构的奠基者。1945年6月,冯·诺依曼提出了在数字计算机内部的存储器中存放程序的概念,这是所有现代计算机的范式,被称为“冯·诺依曼结构”计算机体系结构的奠基者

冯·诺依曼输入设备存储器输出设备控制器运算器CPU数据流指令流控制流“冯·诺依曼结构”保存数据与程序发生运算统一调度2.1.1计算机的缘起函数式编程命令式编程编程范式编程的基本风格2.1.2

编程范式命令式语言冯·诺依曼体系命令冯•诺依曼机器的指令序列命令式程序程序执行2.1.2

编程范式λ

演算泛函编程函数式编程2.1.2

编程范式近些年函数式编程会迅速升温呢?命令式编程函数式编程2.1.2

编程范式涉及多线程之间的状态共享命令式编程保证数据的一致性锁机制函数式编程锁机制不会在多个线程之间并发处理2.1.2

编程范式2.1.3Scala简介面对象编程风格函数式编程风格2.1.3Scala简介Java虚拟机(JVM)Scala特点兼容现有的Java程序2.1.3Scala简介面向对象的语言一门函数式语言2.1.3Scala简介MartinOdersky(Scala之父)詹姆斯·高斯林(Java之父)詹姆斯·高斯林(Java之父)“IfIweretopickalanguagetousetodayotherthanJava,itwouldbeScala.”

—JamesGosling

2.1.3Scala简介2.1.4Scala的安装2.1.4Scala的安装/blog/929-2/2.1.4Scala的安装2.1.4Scala的安装支持多种操作系统WindowLinuxMacOS2.1.4Scala的安装Linux系统的安装方法/blog/1257-2/2.1.4Scala的安装直接通过命令安装OpenJDK7配置JAVA_HOME环境变量,用下面的命令打开配置文件$sudoapt-getinstallopenjdk-8-jreopenjdk-8-jdk$vim~/.bashrc在文件开头增加如下语句exportJAVA_HOME=/usr/lib/jvm/java-1.8.0-openjdk-amd64在Linux系统中安装Java2.1.4Scala的安装退出文件编辑,并运行如下命令使配置立即生效配置JAVA_HOME环境变量,用下面的命令打开配置文件$source~/.bashrc#使变量设置生效$java-versionopenjdkversion“11.0.15”2022-04-19#输出当前版本号和编译时间在Linux系统中安装Java2.1.4Scala的安装安装Scala2.12.15版本3.2.0版本2.1.4Scala的安装登录Scala官网,下载scala-2.12.15.tgz$source~/.bashrc$sudotar-zxf~/下载/scala-2.12.15.tgz-C/usr/local#解压到/usr/local中$cd/usr/local/$sudomv./scala-2.12.15/./scala#将文件夹名改为scala$sudochown-Rhadoop./scala#使hadoop用户拥有对scala目录的权限安装Scala

对应的Scala版本是2.12.152.1.4Scala的安装修改配置文件,把scala命令路径添加到path环境变量中检验一下是否设置正确$vim~/.bashrc$scala–versionScalacoderunnerversion2.12.15...#省略了部分输出安装Scala

对应的Scala版本是2.12.15exportPATH=$PATH:/usr/local/scala/bin2.1.5HelloWorld可以使用命令“:quit”退出Scala解释器在Shell命令提示符界面中输入“scala”命令后,会进入scala命令行提示符状态scala>//可以在命令提示符后面输入命令通过HelloWorld程序了解Scala解释器的使用方法scala>:quit2.1.4Scala的安装在

Scala

解释器中运行脚本文件用“:load”命令导入脚本,一次运行多行程序:使用文本编辑器(比如vim)创建一个代码文件Test.scala在ScalaREPL中执行如下命令运行该代码文件://代码文件为/usr/local/scala/mycode/Test.scalaprintln("Thisisthefirstline")println("Thisisthesecondline")println("Thisisthethirdline")scala>:load/usr/local/scala/mycode/Test.scalaLoading/usr/local/scala/mycode/Test.scala…ThisisthefirstlineThisisthesecondlineThisisthethirdline2.1.4Scala的安装通过编译打包的方式运行Scala程序使用scalac命令进行编译(编译的结果为Java字节码)使用scala或者java命令运行字节码文件//代码文件为/usr/local/scala/mycode/HelloWorld.scalaobjectHelloWorld{defmain(args:Array[String]){println("Hello,world!");}}$cd/usr/local/scala/mycode$scalacHelloWorld.scala$scala-classpath.HelloWorld$java-classpath.:/usr/local/scala/lib/scala-library.jarHelloWorldScala基础知识2.2Scala基础知识提纲2输入输出3控制结构1基本数据类型和变量4数据结构2.2.1

基本数据类型和变量基本数据类型基本操作变量2.2.1

基本数据类型和变量基本数据类型BooleanByteCharShortIntLongFloatDouble2.2.1

基本数据类型和变量Int类型scala.Int类2.2.1

基本数据类型和变量java.lang.String2.2.1

基本数据类型和变量数据类型取值范围Byte8位有符号补码整数(-27~27-1)short16位有符号补码整数(-215~215-1)Int32位有符号补码整数(-231~231-1)Long64位有符号补码整数(-263~263-1)Char16位无符号补码整数(0~216-1)String字符序列Float32位IEEE754单精度浮点数Double64位IEEE754单精度浮点数Booleantrue或false2.2.1

基本数据类型和变量vali=123//123就是整数字面量vali=3.14//3.14就是浮点数字面量vali=true//true就是布尔型字面量vali='A'//'A'就是字符字面量vali=“Hello”//“Hello”就是字符串字面量

字面量(literal)2.2.1

基本数据类型和变量操作符类型操作符算术运算符加(+)、减(-)、乘(*)、除(/)、余数(%)关系运算符大于(>)、小于(<)、等于(==)、不等于(!=)、大于等于(>=)、小于等于(<=)逻辑运算符逻辑与(&&)、逻辑或(||)、逻辑非(!)位运算符按位与(&)、按位或(|)、按位异或(^)、按位取反(~)等赋值运算符=及其与其它运算符结合的扩展赋值运算符,例如+=、%=2.2.1

基本数据类型和变量

操作符优先级算术运算符>>>关系运算符逻辑运算符赋值运算符2.2.1

基本数据类型和变量

scala>valsum1=5+3//实际上调用了(5).+(3)sum1:Int=8scala>valsum2=(5).+(3)

//可以发现,写成方法调用的形式,和上面得到相同

的结果sum2:Int=8a.方法(b)a方法b

操作符定义成方法2.2.1

基本数据类型和变量富包装类RichInt类RichStringIntStringmaxscala.runtime2.2.1

基本数据类型和变量富包装类35maxInt类型Int类型对象不属于这个Int类型的方法Scala会自动通过隐式转换将该对象转换为对应的富包装类型,然后再调用相应的方法2.2.1

基本数据类型和变量变量不可变可变函数式编程面向对象编程2.2.1

基本数据类型和变量val不可变声明时必须初始化不能再赋值var可变的声明时需要初始化可以再赋值valvar不同类型变量2.2.1

基本数据类型和变量val变量名:数据类型=初始值

var

变量名:数据类型=初始值valvar规范格式2.2.1

基本数据类型和变量类型推断机制:根据初始值自动推断变量的类型scala>valmyStr="HelloWorld!"myStr:String=HelloWorld!当然,我们也可以显式声明变量的类型scala>valmyStr2:String="HelloWorld!"myStr2:String=HelloWorld!scala>myStr="HelloScala!"<console>:27:error:reassignmenttovalmyStr="HelloScala!"^myStr是val变量,因此,一旦初始化以后,就不能再次赋值2.2.1

基本数据类型和变量scala>varmyPrice:Double=9.9myPrice:Double=9.9scala>myPrice=10.6myPrice:Double=10.6var变量初始化以后,可以再次赋值注意:在REPL环境下,可以重复使用同一个变量名来定义变量,而且变量前的修饰符和其类型都可以不一致,REPL会以最新的一个定义为准scala>vala="XiamenUniversity"a:String=XiamenUniversityscala>vara=50a:Int=50类型推断机制:根据初始值自动推断变量的类型2.2.2输入输出控制台输入输出语句读写文件输入输出(scala.io.StdIn)readIntreadShortreadCharreadDoublereadFloatreadBooleanreadBytereadLongreadLine从控制台读入数据的方法2.2.2输入输出使用前,必须导入直接用全称进行调用scala.io.StdIn从控制台读入数据的方法2.2.2输入输出2.2.2输入输出控制台输入输出语句:从控制台读入数据方法scala>importio.StdIn._importio.StdIn._scala>vari=readInt()54i:Int=54scala>varf=readFloat1.618f:Float=1.618scala>varb=readBooleantrueb:Boolean=truescala>varstr=readLine("pleaseinputyourname:")pleaseinputyourname:LiLeistr:String=LiLei2.2.2输入输出scala>vali=345i:Int=345scala>print("i=");print(i)//两条语句位于同一行,不能省略中间的分号i=345scala>println("hello");println("world")helloworld控制台输入输出语句:C语言风格格式化字符串的printf()函数print()和println(),可直接输出字符串或者其它数据类型,println在末尾自动换行2.2.2输入输出C语言printf%C语言风格的格式化字符串Scala继承了C语言格式化字符串的风格加各种各样的格式化字符串2.2.2输入输出控制台输入输出语句:C语言风格格式化字符串的printf()函数print()、println()和printf()都在对象Predef中定义,该对象默认情况下被所有的Scala程序引用,可直接使用Predef对象提供的方法,无需使用scala.Predef.的形式scala>vali=34i:Int=34scala>valf=56.5f:Double=56.5scala>printf("Iam%dyearsoldandweight%.1fKg.","LiLie",i,f)Iam34yearsoldandweight56.5Kg.2.2.2输入输出控制台输入输出语句字符串插值机制s字符串f字符串2.2.2输入输出控制台输入输出语句:s字符串和f字符串基本语法:s"…$变量名…"或f"…$变量名%格式化字符…"scala>vali=10i:Int=10scala>valf=3.5f:Double=3.5452scala>vals="hello"s:String=helloscala>println(s"$s:i=$i,f=$f")//s插值字符串hello:i=10,f=3.5452scala>println(f"$s:i=$i%-4d,f=$f%.1f")//f插值字符串hello:i=10,f=3.52.2.2输入输出控制台输入输出语句读写文件输入输出2.2.2输入输出写入文件java.io.PrintWriterprintlnprint2.2.2输入输出读写文件:Scala需要使用java.io.PrintWriter实现把数据写入到文件PrintWriter类提供了print和println两个写方法scala>importjava.io.PrintWriterscala>valoutputFile=newPrintWriter("test.txt")scala>outputFile.println("HelloWorld")scala>outputFile.print("Sparkisgood")scala>outputFile.close()2.2.2输入输出读取文件:用scala.io.Source的getLines方法实现对文件中所有行的读取2.2.3控制结构if条件表达式while循环for循环异常处理对循环的控制2.2.3控制结构控制结构:if条件表达式if(表达式){

语句块1}else{

语句块2}valx=6if(x>0){println(“Thisisapositivenumber”)}else{println(“Thisisnotapositivenumber”)}2.2.3控制结构控制结构:if

条件表达式valx=3if(x>0){println(“Thisisapositivenumber”)}elseif(x==0){println(Thisisazero”)}else{println(“Thisisanegativenumber”)}2.2.3控制结构if

表达式可以再次赋值给变量2.2.3控制结构控制结构:if条件表达式valx=6vala=if(x>0)1else-12.2.3控制结构while(表达式){

循环体}do{

循环体}while(表达式)控制结构:while循环2.2.3控制结构vari=9while(i>0){i-=1printf(“iis%d\n”,i)}vari=0do{i+=1printf(i)}while(i<5)可变类型的变量i不小于5它就退出循环i等于0以后它就停止执行控制结构:while循环2.2.3控制结构生成器(generator)for

(变量

<-表达式){语句块}for循环2.2.3控制结构for(i<-1to5)println(i)for(i<-1to5by2)println(i)12345135控制结构:for循环2.2.3控制结构for(i<-1to5ifi%2==0)println(i)24for(变量<-表达式if

条件表达式)语句块控制结构:for循环—“守卫(guard)”的表达式2.2.3控制结构12324636for(i<-1to5;j<-1to3)println(i*j)9481251015支持“多个生成器”的情形,用分号隔开2.2.3控制结构生成器for推导式for(变量<-表达式)yield{语句块}scala>valr=for(i<-Array(1,2,3,4,5)ifi%2==0)yield{println(i);i}24r:Array[Int]=Array(2,4)2.2.3控制结构异常处理

受检异常(checkedexception)

不受检异常(uncheckedexception)2.2.3控制结构受检异常清晰地知道错误代码的执行过程写代码的时候2.2.3控制结构受检异常错误处理方法代码的执行过程2.2.3控制结构不受检异常错误代码的运行过程2.2.3控制结构受检异常优点在编程之前运行过程中会产生的错误2.2.3控制结构受检异常优点写代码时错误1错误2错误3……处理方式1处理方式2处理方式3……2.2.3控制结构不受检异常(uncheckedexception)异常处理受检异常(checkedexception)2.2.3控制结构import

java.io.FileReader

import

java.io.FileNotFoundException

import

java.io.IOException

try

{

valf=new

FileReader("input.txt")

//文件操作}

catch

{

caseex:FileNotFoundException=>

//文件不存在时的操作

caseex:IOException=>

//发生I/O错误时的操作}finally

{

file.close()//确保关闭文件}

控制结构:for循环2.2.3控制结构对循环的控制breakcontinue2.2.3控制结构Breaks类(包scala.util.control)对循环的控制2.2.3控制结构Breaks类(包scala.util.control)breakbreakable2.2.3控制结构breakable{...if(...)break...}Breaks类(包scala.util.control)2.2.3控制结构控制结构:对循环的控制//代码文件为/usr/local/scala/mycode/TestBreak.scalaimportutil.control.Breaks._//导入Breaks类的所有方法valarray=Array(1,3,10,5,4)breakable{for(i<-array){ if(i>5)break//跳出breakable,终止for循环,相当于Java中的breakprintln(i) }}//上面的for语句将输出1,32.2.3控制结构控制结构:对循环的控制for(i<-array){ breakable{ if(i>5)break//跳出breakable,终止当次循环,相当于Java的continue println(i) }}//上面的for语句将输出1,3,5,42.2.4数据结构数组Array元组Tuple容器Collection序列Sequence集合Set映射Map迭代器Iterator2.2.4数据结构数组(Array)可变的可索引的元素是相同类型2.2.4数据结构提供了参数化类型的通用数组类Array[T]2.2.4数据结构数组(Array):对循环的控制—声明一个整型数组valintValueArr=newArray[Int](3)//声明一个长度为3的整型数组,每个数组元素初始化为0intValueArr(0)=12//给第1个数组元素赋值为12intValueArr(1)=45//给第2个数组元素赋值为45intValueArr(2)=33//给第3个数组元素赋值为332.2.4数据结构数组(Array):声明一个字符串数组valmyStrArr=newArray[String](3)//声明一个长度为3的字符串数组,每个数组元素初始化为nullmyStrArr(0)="BigData"myStrArr(1)="Hadoop"myStrArr(2)="Spark"for(i<-0to2)println(myStrArr(i))2.2.4数据结构数组(Array):可不给出数组类型,Scala会自动根据初始化数据来推断数组类型valintValueArr=Array(12,45,33)valmyStrArr=Array("BigData","Hadoop","Spark")数组(Array):多维数组的创建:调用Array的ofDim方法valmyMatrix=Array.ofDim[Int](3,4)//类型实际就是Array[Array[Int]]valmyCube=Array.ofDim[String](3,2,4)//类型实际是Array[Array[Array[String]]可以使用多级圆括号来访问多维数组的元素,例如myMatrix(0)(1)返回第一行第二列的元素2.2.4数据结构对多个不同类型对象的一种简单封装元组(Tuple)2.2.4数据结构元组(Tuple):定义元组是把多个元素用逗号分开并用圆括号包围起来使用下划线“_”加上从1开始的索引值,来访问元组的元素2.2.4数据结构可返回多个不同类型对象元组(Tuple)tuple2.2.4数据结构(Collection)容器(Set)集合2.2.4数据结构容器库

提供序列集合映射2.2.4数据结构容器类的三个包scala.collectionscala.collection.immutablescala.collection.mutable

容器(Collection)2.2.4数据结构scala.collection容器(Collection)可变容器不可变容器封装了一些超类或特质2.2.4数据结构scala.collection定义了一些可变容器和不可变的一些通用操作scala.collection包中容器的宏观层次结构2.2.4数据结构2.2.4数据结构序

列元素可以按照特定的顺序访问的容器

序列(Sequence)

2.2.4数据结构序列中元素都带从0开始计数的固定索引位置

序列(Sequence)

2.2.4数据结构序列容器根collection.Seq2.2.4数据结构LinearSeq有高效的随机存取操作IndexedSeqSeq取头或取尾巴操作2.2.4数据结构LinearSeq列表队列可变数组(ArrayBuffer)

向量(Vector)共享相同类型的不可变的对象序列列表(List)列表List容器类scala.collection.immutable2.2.4数据结构列表的值不可变列表(List)的特征2.2.4数据结构varstrList=List("BigData","Hadoop","Spark")列表(List)的初始化2.2.4数据结构List头部尾部headtail列表(List)返回的是列表第一个元素的值返回的是除第一个元素外的其它值构成的新列表2.2.4数据结构varstrList=List("BigData","Hadoop","Spark")列表(List)的初始化strList.head2.2.4数据结构varstrList=List("BigData","Hadoop","Spark")列表(List)的初始化strList.tail2.2.4数据结构向已有列表

前端增加元素构造列表常用的方法2.2.4数据结构构造列表常用的方法valotherList="Apache"::strList操作符2.2.4数据结构otherListList("BigData","Hadoop","Spark")strListList("Apache","BigData","Hadoop","Spark")2.2.4数据结构01valintList=List(1,2,3)构造列表常用的方法02valintList=1::2::3::Nil2.2.4数据结构注意:除了head、tail操作是常数时间O(1),其它按索引访问的操作都需要从头开始遍历,因此是线性时间复杂度O(N)。2.2.4数据结构序列(Sequence)—向量(Vector):Vetor可实现所有访问操作都是常数时间scala>valvec1=Vector(1,2)vec1:scala.collection.immutable.Vector[Int]=Vector(1,2,3)scala>valvec2=3+:4+:vec1vec2:scala.collection.immutable.Vector[Int]=Vector(3,4,1,2)scala>valvec3=vec2:+5vec3:scala.collection.immutable.Vector[Int]=Vector(3,4,1,2,5)scala>vec3(3)res6:Int=22.2.4数据结构一种特殊的带索引的不可变数字等差序列从给定起点按一定步长增长(减小)到指定终点的所有数值Range2.2.4数据结构RangeIntBigDecimalLongBigIntFloatDoubleChar2.2.4数据结构步长1to5by2起点终点Range2.2.4数据结构scala>valr=newRange(1,5,1)scala>1to5res0:scala.collection.immutable.Range.Inclusive=Range(1,2,3,4,5)scala>1.to(5)res1:scala.collection.immutable.Range.Inclusive=Range(1,2,3,4,5)序列(Sequence):创建一个从1到5的数值序列,包含区间终点5,步长为12.2.4数据结构创建一个从1到5的数值序列,不包含区间终点5,步长为1创建一个从1到10的数值序列,包含区间终点10,步长为2创建一个Float类型的数值序列,从0.5f到5.9f,步长为0.3f2.2.4数据结构2.2.4数据结构集合(Set)不重复元素的容器(collection)2.2.4数据结构有些数据结构元素重复2.2.4数据结构集合(Set)集合元素重复2.2.4数据结构先后51234列表(List)2.2.4数据结构快速找到某个具体值集合哈希方法2.2.4数据结构从头到尾遍历列表查找某个元素2.2.4数据结构集合(Set)scala.collection.mutable包集合(Set)可变集不可变集scala.collection.immutable包2.2.4数据结构集合(Set):可变类型的变量varmySet=Set("Hadoop","Spark")mySet+="Scala"生成不可变集的对象2.2.4数据结构集合(Set):可变类型的变量,声明一个可变集importscala.collection.mutable.SetvalmyMutableSet=Set("Database","BigData")myMutableSet+="CloudComputing"myMutableSetSet("Database","BigData")Set(“Database”,“BigData”,"CloudComputing")2.2.4数据结构一系列键值对的容器,键是唯一的,但值不一定唯一键1键2值1值2映射(Map)2.2.4数据结构映射(Map)不可变可变scala.collection.mutable包scala.collection.immutable包(默认)2.2.4数据结构映射(Map)可变scala.collection.mutable包不可变scala.collection.immutable包映射

(Map)

:具体实例valuniversity=Map("XMU"->"XiamenUniversity","THU"->"TsinghuaUniversity","PKU"->"PekingUniversity")如果要获取映射中的值,可以通过键来获取若给定键不存在,则会抛出异常,访问前可先调用contains方法确定键是否存在println(university("XMU"))valxmu=if(university.contains("XMU"))university("XMU")else02.2.4数据结构2.2.4数据结构映射

(Map)

:可变的映射具体实例也可以使用+=操作来添加新的元素importscala.collection.mutable.Mapvaluniversity2=Map("XMU"->"XiamenUniversity","THU"->"TsinghuaUniversity","PKU"->"PekingUniversity")university2("XMU")="XimanUniversity"//更新已有元素的值university2("FZU")="FuzhouUniversity"//添加新元素university2+=("TJU"->"TianjinUniversity")//添加一个新元素university2+=("SDU"->"ShandongUniversity","WHU"->"WuhanUniversity")//同时添加两个新元素2.2.4数据结构按顺序访问容器容

器数据结构迭代器(Iterator)2.2.4数据结构返回迭代器的下一个元素检测是否还有下一个元素迭代器(Iterator)nexthasNext2.2.4数据结构迭代器(Iterator):迭代器基本操作具体实例建议:除next和hasnext方法外在对一个迭代器调用了某个方法后,不要再次使用该迭代器val

iter=Iterator("Hadoop","Spark","Scala")while(iter.hasNext){

println(iter.next())}面向对象编程基础2.3.1类目录2.3.1类2.3.2对象2.3.3继承2.3.4参数化类型2.3.5特质2.3.6模式匹配2.3.7包2.3.1类类的定义1类成员的可见性2方法的定义方式3构造器42.3.1类类的定义

具体实例classCounter{//这里定义类的字段和方法}修饰关键词val定义可变的变量修饰关键词var定义不可变的变量2.3.1类类的定义

:方法定义和具体实例def方法名(参数列表):返回结果类型={方法体}classCounter{varvalue=0defincrement(step:Int):Unit={value+=step}defcurrent():Int={value}}2.3.1类类的定义

具体实例使用new关键字创建一个类的实例classCounter{varvalue=0defincrement(step:Int):Unit={value+=step}defcurrent():Int={value}}valmyCounter=newCountermyCounter.value=5//访问字段myCounter.increment(3)//调用方法println(myCounter.current)//调用无参数方法时,可以省略方法名后的括号2.3.1类类成员的可见性privateprotected决定类成员的可见范围2.3.1类私

有Scala类privateprotected本类型可见嵌套类型可见本类型可见其它继承类型可见标题文字不暴露内部字段2.3.1类设置getter方法设置setter方法封装声明私有2.3.1类标题文字public字段类成员的可见性设置成私有2.3.1类读取变量值写入新的值settergetter2.3.1类valuevalue_=读取修改2.3.1类类成员的可见性

具体实例//代码文件为/usr/local/scala/mycode/Counter.scalaclassCounter{privatevarprivateValue=0defvalue=privateValuedefvalue_=(newValue:Int){if(newValue>0)privateValue=newValue}defincrement(step:Int):Unit={value+=step}defcurrent():Int={value}}2.3.1类类成员的可见性

具体实例scala>:load/usr/local/scala/mycode/Counter.scalaLoading/usr/local/scala/mycode/Counter.scala…definedclassCounterscala>valmyCounter=newCountermyCounter:Counter=Counter@f591271scala>myCounter.value_=(3)//为privateValue设置新的值scala>println(myCounter.value)//访问privateValue的当前值3myCounter.value=3//等效于myCounter.value_=(3)2.3.1类方法定义:def方法名(参数列表):返回结果类型={方法体}参数不能用val和var作为前缀去修饰没有参数的方法在定义的时候是可以圆括号省略掉的类成员的可见性

方法的定义方式2.3.1类类成员的可见性

方法的定义方式方法定义:def方法名(参数列表):返回结果类型={方法体}一个方法如果只有一个参数可以省略圆点而采用中缀操作符调用方法2.3.1类整数调用中缀操作符调用方法aa.+(b)对象a+b2.3.1类类成员的可见性

方法的定义方式//代码文件为/usr/local/scala/mycode/Counter1.scalaclassCounter{varvalue=0defincrement(step:Int):Unit={value+=step}defcurrent:Int=valuedefgetValue():Int=value}2.3.1类类成员的可见性

方法的定义方式scala>:load/usr/local/scala/mycode/Counter1.scalaLoading/usr/local/scala/mycode/Counter1.scala…definedclassCounterscala>valc=newCounterc:Counter=Counter@30ab4b0escala>cincrement5//中缀调用法scala>c.getValue()//getValue定义中有括号,可以带括号调用res0:Int=02.3.1类类成员的可见性

方法的定义方式scala>c.getValue//getValue定义中有括号,也可不带括号调用res1:Int=0scala>c.current()//current定义中没有括号,不可带括号调用<console>:13:error:Intdoesnottakeparametersc.current()^scala>c.current//current定义中没有括号,只能不带括号调用res3:Int=02.3.1类80可以省略结果类型返回结果可推断可以同时省略返回结果类型和等号,但不能省略大括号返回类型为UnitclassCounter{varvalue=0defincrement(step:Int){value+=step}//赋值表达式的值为Unit类型defcurrent()=value//根据value的类型自动推断出返回类型为Int型}2.3.1类构造器类主构造器2.3.1类Scala构造器类名称(参数列表)用圆括号2.3.1类val

var修饰在方法定义里面的参数列表参数2.3.1类主构造器关键字var关键字val2.3.1类放在主构造器参数列表里面的参数自动变成它的类内部的成员字段2.3.1类构造器:如果不希望构造器参数成为类的字段,只需省略关键字var或者valscala>classCounter(varname:String)//定义一个带字符串参数的简单类definedclassCounterscala>varmycounter=newCounter("Runner")mycounter:Counter=Counter@17fcc4f7scala>println()//调用读方法Runnerscala>_=("Timer")//调用写方法scala>="Timer"//更直观地调用写方法,和上句等效:String=Timer2.3.1类主构造器辅助构造器2.3.1类类(参数)(参数)(参数)定义不同的构造器与辅助构造器,this的返回类型为UnitThis(参数列表)2.3.1类//代码文件为/usr/local/scala/mycode/Counter2.scalaclassCounter{privatevarvalue=0privatevarname=""privatevarstep=1//计算器的默认递进步长

println("themainconstructor")defthis(name:String){//第一个辅助构造器

this()//调用主构造器

=nameprintf("thefirstauxiliaryconstructor,name:%s\n",name)}defthis(name:String,step:Int){//第二个辅助构造器

this(name)//调用前一个辅助构造器

this.step=stepprintf("thesecondauxiliaryconstructor,name:%s,step:%d\n",name,step)}defincrement(step:Int):Unit={value+=step}defcurrent():Int={value}}2.3.1类scala>:load/usr/local/scala/mycode/Counter2.scalaLoading/usr/local/scala/mycode/Counter2.scala…definedclassCounterscala>valc1=newCounterthemainconstructorc1:Counter=Counter@319c6b2

scala>valc2=newCounter("the2ndCounter")themainconstructorthefirstauxiliaryconstructor,name:the2ndCounterc2:Counter=Counter@4ed6c602

scala>valc3=newCounter("the3rdCounter",2)themainconstructorthefirstauxiliaryconstructor,name:the3rdCounterthesecondauxiliaryconstructor,name:the3rdCounter,step:2c3:Counter=Counter@64fab83b2.3.1类2.3.2对象单例对象apply方法update方法unapply方法2.3.2对象同样的功能Java静态成员单例对象(singletonobject)2.3.2对象单例对象:使用object关键字定义单例对象//代码文件为/usr/local/scala/mycode/Person.scalaobjectPerson{privatevarlastId=0//一个人的身份编号defnewPersonId()={lastId+=1lastId}}2.3.2对象单例对象:单例对象的使用与一个普通的类实例一样//代码文件为/usr/local/scala/mycode/Person.scalaobjectPerson{privatevarlastId=0//一个人的身份编号defnewPersonId()={lastId+=1lastId}}2.3.2对象单例对象:单例对象的使用与一个普通的类实例一样scala>:load/usr/local/scala/mycode/Person.scalaLoading/usr/local/scala/mycode/Person.scala…definedobjectPersonscala>printf("Thefirstpersonid:%d.\n",Person.newPersonId())Thefirstpersonid:1.scala>printf("Thesecondpersonid:%d.\n",Person.newPersonId())Thesecondpersonid:2.scala>printf("Thethirdpersonid:%d.\n",Person.newPersonId())Thethirdpersonid:3.2.3.2对象伴生对象孤立对象单例对象2.3.2对象单例对象同名类的伴生对象同名类单例对象的伴生类互为伴生关系2.3.2对象类伴生对象互相访问对方内部的成员变量和成员方

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论