Scala模式匹配、类型系统与Spark源码阅读

java switch-case(对值)

scala不仅对值,而且可以对类型,集合(map,list元数据匹配),object,class

scala大量使用模式匹配(match case)

Scala的模式匹配,与Java的switch case的区别

1.不仅可以匹配值,可以匹配类型

2.可以匹配数组的集合

相同数组、长度相同的数组、以某个元素开头的数组

对于长度相同的数组,会进行自动变量赋值

3.匹配class - 样例类case class

类似于Java里的Bean

一般都不可改变,默认只有getter

可用于消息通信

基类传参数,用match匹配不同的子类去接收和处理

Some()和None(),在模式匹配时表示匹配到和匹配不到

case class 和 case object区别前者会生成多个实例,后者只有一个实例,就是它本身

data输入数据,是一个String

下划线表示既不是spark也不是hadoop

简单示例

类似于switch case语句

下划线代表默认情况

可以在默认下用if进行分支判断

def bigData(data: String, age: Int){
data match{
case "Spark" => println("Wow!!")
case "Hadoop" => println("OK!!")
case data_ if(age>18) => println("adult")
case _ => println("nothing")
}
}

传入两个参数

传入两个参数改写

match外的变量,可以自动传给match里的变量

data赋值给data_

def bigData(data : String){
   data match{
    case "Spark" => println("wow")
    case "Hadoop" => println("ok")
    case data_ if data_ == "Flink" => println("cool"+data_)
    case _ => println("something else")
   }
}

输出结果

类型匹配

异常类型进行匹配,第一种类型匹配,匹配FileNotFound,Exception本身打印出来,包括完整的包名,类名,后面是填入的信息oops

import java.io._
def exception(e :Exception){
e match{
case fileException : FileNotFoundException => println("File Not Found:"+fileException)
case _: Exception => println("Exception getting thread dump from $executorId",e)
}
}

集合匹配

数组,数组中指定的元素,指定个数的元素的数组,以及数组以某元素开头的数组,Set,list一致的

Array的模式匹配

传入三个元素,分别赋值给spark,hadoop,flink(它们是三个变量)

def data(array:Array[String])
{
array match{
case Array("Scala") => println("Scala")
case Array(spark,hadoop,flink) => println(spark+" : "+hadoop+" : "+flink)
case Array("Spark", _*) => println("Spark ...")//以Spark开头
case _ => println("Unknown")
}

类匹配

case class 相当于java中javabean 默认是val类型 只有getter方法 ,通过case class可以进行类的模式匹配

def sayHi(person:Person){
person match{
      case Student(name,score) => println("I am a studnet:"+name+score)
      case Worker(name,salary) => println("I am a worker:"+name+salary)
      case _ =>println("Unknow")
     }
     }

自动匹配到worker(worker,student是person的子类)

case class 生成多个实例

case object 只有一个实例

泛型函数

class Person[T](val content : T){
def getContent(id : T) = id + " _ " + content
}

val p = new Person[String]("Spark")
p.getContent("Scala")//必须为String 类型

类型体系

泛型类、泛型函数、类型界定(upperBound)、视图界定(View Bounds)、协变和逆变等

类型参数,主要用于类型限定,加强代码的健壮性

1.泛型类和泛型函数

2.类型界定

对类型也可以限定边界,upperBounds(<:表示,上边界,是它或它的子类),(>:表示,下边界,是某个类的父类或类本身)

3.视图界定

视图界定(View Bounds)

View Bounds隐式转换

对类型进行implicit隐式转换

implict  def rddToSequendeFileRDDFuncions[K <% Wirtable:ClassTag,V <% Writable:ClassTag]

类型[T],在上下文中注入隐式值,而且注入的过程是自动的

class Compare[T :ordering](val n1:T,val n2:T){
def bigger(implicit ordered :Ordering[T])=
}

Manifest->ClassTag

T:ClassTag,T是泛型,运行时有更完善的类型匹配,反射获取类型的信息

时间: 2024-11-05 14:55:46

Scala模式匹配、类型系统与Spark源码阅读的相关文章

Scala实战高手****第13课Scala模式匹配实战和Spark源码鉴赏

package com.dt.spark.scala.bascis class Dataframework case class Computerframework (name:String,popular:Boolean) extends Dataframework case class Storgeframework (name:String,popular:Boolean) extends Dataframework object helloPatternMatch { def main(

[Apache Spark源码阅读]天堂之门——SparkContext解析

稍微了解Spark源码的人应该都知道SparkContext,作为整个Project的程序入口,其重要性不言而喻,许多大牛也在源码分析的文章中对其做了很多相关的深入分析和解读.这里,结合自己前段时间的阅读体会,与大家共同讨论学习一下Spark的入口对象—天堂之门—SparkContex. SparkContex位于项目的源码路径\spark-master\core\src\main\scala\org\apache\spark\SparkContext.scala中,源文件包含Classs Sp

【Spark】配置Spark源码阅读环境

Scala构建工具(SBT)的使用 SBT介绍 SBT是Simple Build Tool的简称,如果读者使用过Maven,那么可以简单将SBT看做是Scala世界的Maven,虽然二者各有优劣,但完成的工作基本是类似的. 虽然Maven同样可以管理Scala项目的依赖并进行构建,但SBT的某些特性却让人如此着迷,比如: 使用Scala作为DSL来定义build文件(one language rules them all); 通过触发执行(trigger execution)特性支持持续的编译与

Spark源码阅读笔记之Broadcast(一)

Spark源码阅读笔记之Broadcast(一) Spark会序列化在各个任务上使用到的变量,然后传递到Executor中,由于Executor中得到的只是变量的拷贝,因此对变量的改变只在该Executor有效.序列化后的任务的大小是有限制的(由spark.akka.frameSize决定,值为其减去200K,默认为10M-200K),spark会进行检查,超出该限制的任务会被抛弃.因此,对于需要共享比较大的数据时,需要使用Broadcast. Spark实现了两种传输Broadcast的机制:

第3课 Scala函数式编程彻底精通及Spark源码阅读笔记

本课内容: 1:scala中函数式编程彻底详解 2:Spark源码中的scala函数式编程 3:案例和作业 函数式编程开始: def fun1(name: String){ println(name) } //将函数名赋值给一个变量,那么这个变量就是一个函数了. val fun1_v = fun1_ 访问 fun1_v("Scala") 结果:Scala 匿名函数:参数名称用 => 指向函数体 val fun2=(content: String) => println(co

Spark修炼之道(高级篇)——Spark源码阅读:第一节 Spark应用程序提交流程

作者:摇摆少年梦 微信号: zhouzhihubeyond spark-submit 脚本应用程序提交流程 在运行Spar应用程序时,会将spark应用程序打包后使用spark-submit脚本提交到Spark中运行,执行提交命令如下: root@sparkmaster:/hadoopLearning/spark-1.5.0-bin-hadoop2.4/bin# ./spark-submit --master spark://sparkmaster:7077 --class SparkWordC

Spark修炼之道(高级篇)——Spark源码阅读:第十节 Standalone运行模式解析

Spark Standalone采用的是Master/Slave架构,主要涉及到的类包括: 类:org.apache.spark.deploy.master.Master 说明:负责整个集群的资源调度及Application的管理. 消息类型: 接收Worker发送的消息 1. RegisterWorker 2. ExecutorStateChanged 3. WorkerSchedulerStateResponse 4. Heartbeat 向Worker发送的消息 1. Registered

Spark修炼之道(高级篇)——Spark源码阅读:第二节 SparkContext的创建

博文推荐:http://blog.csdn.net/anzhsoft/article/details/39268963,由大神张安站写的Spark架构原理,使用Spark版本为1.2,本文以Spark 1.5.0为蓝本,介绍Spark应用程序的执行流程. 本文及后面的源码分析都以下列代码为样板 import org.apache.spark.{SparkConf, SparkContext} object SparkWordCount{ def main(args: Array[String])

Spark修炼之道(高级篇)——Spark源码阅读:第三节 Spark Job的提交

前一我们分析了SparkContext的创建,这一节,我们介绍在RDD执行的时候,如何提交job进行分析,同样是下面的源码: import org.apache.spark.{SparkConf, SparkContext} object SparkWordCount{ def main(args: Array[String]) { if (args.length == 0) { System.err.println("Usage: SparkWordCount <inputfile>