spark基础-scala学习(集合)(代码片段)

sky-chen sky-chen     2023-02-02     636

关键词:

集合

  1. scala的集合体系结构
  2. List
  3. LinkedList
  4. Set
  5. 集合的函数式编程
  6. 函数式编程综合案例:统计多个文本内的单词总数

scala的集合体系结构

  1. scala中的集合体系主要包括:Iterable、Seq、Set、Map。其中Iterable是所有集合trait的根trait。这个结构与java的集合体系非常相似
  2. scala中的集合是分成可变和不可变两类集合的,其中可变集合就是说,集合的元素可以动态修改,而不可变集合的元素在初始化之后,就无法修改了。分别对应scala.collection.mutable和scala.collection.immutable两个包
  3. Seq下包含了Range、ArrayBuffer、List等子trait。其中Range就代表了一个序列,通常可以使用“1 to 10”这种语法来产生一个Range。ArrayBuffer就类似于java中的ArrayList

List

  1. List代表一个不可变的列表
  2. List的创建,val list = List(1,2,3,4)
  3. List有head和tail,head代表List的第一个元素,tail代表第一个元素之后的所有元素,list.head,list.tail
  4. List有特殊的::操作符,可以用于将head和tail合并成一个List,0::list
  5. 案例:用递归函数来给List中每个元素都加上指定前缀,并打印
  6. 如果一个List只有一个元素,那么它的head就是这个元素,它的tail为Nil
scala> def decorator(l:List[Int],prefix:String)
     |  if(l != Nil)
     |   println(prefix+l.head)
     |   decorator(l.tail,prefix)
     |  
     | 
decorator: (l: List[Int], prefix: String)Unit

scala> val list = List(1,2,3,5)
list: List[Int] = List(1, 2, 3, 5)

scala> decorator(list,"hello ")
hello 1
hello 2
hello 3
hello 5

scala> list.head
res1: Int = 1

scala> list.tail
res2: List[Int] = List(2, 3, 5)

scala> 8::list
res3: List[Int] = List(8, 1, 2, 3, 5)

LinkedList

  1. LinkedList代表一个可变的列表,使用elem可以引用其头部,使用next可以引用其尾部
  2. val l = scala.collection.mutable.LinkedList(1,2,3,4,5);l.elem;l.next
  3. 案例:使用while循环while循环将列表中的每个元素都乘以2
scala> val list = scala.collection.mutable.LinkedList(1,2,3,5,6)

scala> var currentList = list
currentList: scala.collection.mutable.LinkedList[Int] = LinkedList(1, 2, 3, 5, 6)

scala> while(currentList != Nil)
     |  currentList.elem
     |  currentList.elem = currentList.elem * 2
     |  currentList = currentList.next
     | 
  1. 案例:使用while循环将列表中每隔一个元素就乘以2
scala> :paste
// Entering paste mode (ctrl-D to finish)

val list = scala.collection.mutable.LinkedList(1,2,3,4,5,6,7,8,9,10)
var currentList = list
var first = true
while(currentList != Nil && currentList.next != Nil)
if(first)currentList.elem = currentList.elem * 2;first = false
  currentList = currentList.next.next
  currentList.elem = currentList.elem * 2
  println(currentList.elem)


// Exiting paste mode, now interpreting.

<pastie>:11: warning: object LinkedList in package mutable is deprecated (since 2.11.0): low-level linked lists are deprecated
val list = scala.collection.mutable.LinkedList(1,2,3,4,5,6,7,8,9,10)
                                    ^
6
10
14
18
0
list: scala.collection.mutable.LinkedList[Int] = LinkedList(2, 2, 6, 4, 10, 6, 14, 8, 18, 10)
currentList: scala.collection.mutable.LinkedList[Int] = LinkedList()
first: Boolean = false

Set

  1. Set代表一个没有重复元素的集合
  2. 将重复元素加入Set是没有用的,比如val s = Set(1,2,3);s+1;s+4
  3. 而且Set是不保证插入顺序的,也就是说,Set中的元素是乱序的,val s = new scala.collection.mutable.HashSetInt;s+=1;s+=2;s+=5
  4. LinkedHashSet会用一个链表维护插入顺序,val s = new scala.collection.mutable.LinkedHashSetInt;i+=1;s+=2;s+=5
  5. SrotedSet会自动根据key来进行排序,val s = scala.collection.mutable.SortedSet("orange","apple","banana")
scala> val s = Set(1,2,3)
s: scala.collection.immutable.Set[Int] = Set(1, 2, 3)

scala> s+1
res0: scala.collection.immutable.Set[Int] = Set(1, 2, 3)

scala> s+4
res1: scala.collection.immutable.Set[Int] = Set(1, 2, 3, 4)

scala> val s = new scala.collection.mutable.HashSet[Int]();s+=1;s+=2;s+=5
s: scala.collection.mutable.HashSet[Int] = Set(1, 5, 2)
res2: s.type = Set(1, 5, 2)

scala> val s = new scala.collection.mutable.LinkedHashSet[Int]();s+=1;s+=2;s+=5
s: scala.collection.mutable.LinkedHashSet[Int] = Set(1, 2, 5)
res4: s.type = Set(1, 2, 5)

scala> val s = scala.collection.mutable.SortedSet("orange","apple","banana")
s: scala.collection.mutable.SortedSet[String] = TreeSet(apple, banana, orange)

集合的函数式编程

scala> List("Leo","Jen","Peter","Jack").map("name is " + _)
res7: List[String] = List(name is Leo, name is Jen, name is Peter, name is Jack)

scala> List("Hello World","You Me").flatMap(_.split(" "))
res8: List[String] = List(Hello, World, You, Me)

scala> List("I","have","a","beautiful","house").foreach(println(_))
I
have
a
beautiful
house

scala> List("Leo","Jen","Peter","Jack").zip(List(100,90,75,83))
res10: List[(String, Int)] = List((Leo,100), (Jen,90), (Peter,75), (Jack,83))

综合案例统计多个文本内的单词总数

scala> val lines1 = lines01.mkString
lines1: String = /usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"

scala> val lines2 = lines02.mkString
lines2: String = docker run -p 3307:3306 --name mysql3307 -v $PWD/conf:/etc/mysql/conf.d -v $PWD/logs:/logs -v $PWD/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 -d mysql:5.7

scala> val lines = List(lines1,lines2)
lines: List[String] = List(/usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)", docker run -p 3307:3306 --name mysql3307 -v $PWD/conf:/etc/mysql/conf.d -v $PWD/logs:/logs -v $PWD/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 -d mysql:5.7)

scala> lines.flatMap(_.split(" ")).map((_,1)).map(_._2).reduceLeft(_ + _)
res11: Int = 21

scala> lines.flatMap(_.split(" ")).map((_,1)).map(_._2)
res12: List[Int] = List(1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1)

scala> lines.flatMap(_.split(" ")).map((_,1))
res13: List[(String, Int)] = List((/usr/bin/ruby,1), (-e,1), ("$(curl,1), (-fsSL,1), (https://raw.githubusercontent.com/Homebrew/install/master/install)",1), (docker,1), (run,1), (-p,1), (3307:3306,1), (--name,1), (mysql3307,1), (-v,1), ($PWD/conf:/etc/mysql/conf.d,1), (-v,1), ($PWD/logs:/logs,1), (-v,1), ($PWD/data:/var/lib/mysql,1), (-e,1), (MYSQL_ROOT_PASSWORD=123456,1), (-d,1), (mysql:5.7,1))

spark基础-scala学习(代码片段)

函数式编程将函数赋值给变量匿名函数高阶函数高级函数的类型推断scala的常用高阶函数闭包sam转换currying函数return将函数赋值给变量scala中的函数是一等公民,可以独立定义,独立存在,而且可以直接将函数作为值赋值给变量sca... 查看详情

spark基础-scala学习(代码片段)

面向对象编程之Traittrait基础知识将trait作为接口使用在trait中定义具体方法在trait中定义具体字段在trait中定义抽象字段trait高级知识为实例对象混入traittrait调用链在trait中覆盖抽象方法混合使用trait的具体方法和抽象方法trait的构... 查看详情

spark基础学习笔记13:scala函数(代码片段)

文章目录零、本讲学习目标一、声明函数(一)显式声明函数1、声明格式2、注意事项3、案例演示(二)隐式声明函数1、声明格式2、注意事项3、案例演示二、Scala函数种类(一)成员方法1、基本概念2、... 查看详情

spark基础学习笔记10:scala集成开发环境(代码片段)

...境会在两种集成开发环境里创建Scala项目在上一讲《Spark基础学习笔记09:Scala基础》里,我们都是利用ScalaShell交互式环境来学习Scala基础知识,虽然交互式有快捷的优点,但是要写比较完整的程序,编辑就显得... 查看详情

spark基础学习笔记09:scala基础(代码片段)

...模式。下面我们将在Scala的命令行操作模式中学习Scala的基础知识。一、变量声明(一)简单说明Scala中变量的声明使用关键字val和var。val类似Java中的final变量,也就是常量,一旦初始化将 查看详情

spark基础-scala学习(七类型参数)(代码片段)

类型参数是什么类似于java泛型,泛型类泛型函数上边界Bounds下边界ViewBoundsContextBoundsManifestContextBounds协变和逆变ExistentialType泛型类scala>:paste//Enteringpastemode(ctrl-Dtofinish)classStudent[T](vallocalId:T)defgetSchoolId(hukouId:T)="S-"+hukouId+"-"+localId... 查看详情

spark基础学习笔记08:scala简介与安装(代码片段)

文章目录零、本讲学习目标一、Scala简介(一)Scala概述(二)函数式编程(三)Scala特性1、一切都是对象2、一切都是函数3、一切都是表达式(四)在线运行Scala二、Windows上安装Scala(一)... 查看详情

scala学习之一scala基础语法(代码片段)

环境  虚拟机:VMware10  Linux版本:CentOS-6.5-x86_64  客户端:Xshell4  FTP:Xftp4  jdk1.8  scala-2.10.4(依赖jdk1.8) spark-1.6Scala是一种混合功能编程语言,类似java,运行于JVM,集成面向对象编程和函数式编程的各种特性。(1)Scala... 查看详情

三万字,spark学习笔记(代码片段)

Spark基础Spark特性Spark使用简练优雅的Scala语言编写,基于Scala提供了交互式编程体验,同时提供多种方便易用的API。Spark遵循“一个软件栈满足不同应用场景”的设计理念,逐渐形成了一套完整的生态系统(包括Spar... 查看详情

scala实战高手****第6课:零基础实战scala集合操作及spark源码解析

本课内容1.Spark中Scala集合操作鉴赏2.Scala集合操作实战 ------------------------------------------------------------------------------------------------------------------------/** * 大数据技术是数据的集合以及对数据集合的操作技 查看详情

scala简介及基础语法(代码片段)

...变量SCALA_HOME=E: empscala-2.11.8PATH中加入%SCALA_HOME%in;四、Scala基础语法1)Scala程序的开始HelloWorldobjectHelloWorlddefmain(args:Array[String]):Unit=println("Hello,world!")2)Scala的数据类型Scala与java一样,有8种数值类型:Byte/Char/Short/Int/Long/Float/Double/Bo... 查看详情

scala基础(代码片段)

Scala基础Scala是一门类似Java的多范式语言,集合了面向对象编程和函数式编程的特性。使用Scala语言编写Spark应用程序的考虑:1)Scala具有强大的并发性,支持函数式编程,可以更好的支持分布式系统。在大数... 查看详情

scala的符号入门(代码片段)

...la也随之有更多的人去学习。语言相通,相信有python、java基础的程序员学习Scala并没有太大的难度。但是Scala程序中奇奇怪怪的操作符却让人十分挠头。Scala的教程大多都是从变量定义、函数、类等入门,我们直接从Scala符号入门... 查看详情

scala学习--其他集合类学习(代码片段)

Scala学习--其他集合类学习一、序列列表缓冲ListBufferList类提供对列表头部快速访问,尾部访问并不高效。使用List类在尾部追加元素往往通过reverse,表头添加,reverse实现。通过ListBuffer可以简单实现。ListBuffer是一个可变对象,包... 查看详情

spark记录-scala基础语法

如果您熟悉Java语言语法和编程,那么学习Scala将会很容易。Scala和Java之间最大的句法差异在于行结束字符的分号(;)是可选的。当编写Scala程序时,它可以被定义为通过调用彼此的方法进行通信的对象的集合。现在我们简单地看一... 查看详情

spark学习02天-scala读取文件,词频统计(代码片段)

1.在本地安装jdk环境和scala环境 2.读取本地文件: scala>importscala.io.Sourceimportscala.io.Sourcescala>vallines=Source.fromFile("F:/ziyuan_badou/file.txt").getLines().toListlines:List[String]=List("With 查看详情

scala学习(集合01)(代码片段)

文章目录数组不可变数组可变数组可变数组和不可变数组转换Seq集合不可变List可变List可变集合和不可变集合转换Set集合不可变Set可变SetMap集合不可变Map可变Map数组不可变数组packagelearn04objectScalaCollectiondefmain(args:Array[String]):Unit... 查看详情

scala学习(集合01)(代码片段)

文章目录数组不可变数组可变数组可变数组和不可变数组转换Seq集合不可变List可变List可变集合和不可变集合转换Set集合不可变Set可变SetMap集合不可变Map可变Map数组不可变数组packagelearn04objectScalaCollectiondefmain(args:Array[String]):Unit... 查看详情