大数据Spark蘑菇云前传第15课:Scala类型参数编程实战及Spark源码鉴赏(学习笔记)

前传第15课:Scala类型参数编程实战及Spark源码鉴赏

本課課程:

  1. Spark源码中的Scala类型系統的使用
  2. Scala类型系統编程操作实战

Spark源码中的Scala类型系統的使用

classOf[RDD[_]] 這個也是类型系統

這里的意思是說 B 這種類型必需至少是 A 這樣類型

Ordering

Scala类型系統编程操作实战

作為類型系統最大的就可以對類型進行限制,在Scala 中的類型系統,他本身也作為對象。e.g. 我們可以建立 Person 這個類,現在可以建立一個什麼類型的 Person,比如說億萬富翁這種類型的人

  1. Scala 的類和方法、函数都可以是泛型,在 Spark 源碼中到處都可以看到類和方法的泛型,在實際實例化的時候指定具體的類型,例如Spark 最核心、最基礎、最重要的描象數據結構裡面關於 RDD 的類的定義是泛型,RDD 的几乎所有方法的定義也都是泛型的,之所以這麼做是因為 RDD 會派生很多子類,通過子類配了各種不同的數據源以及業務邏輯操作。

  2. 關於對類型邊界的限定,分為上邊界和下邊界:

    1. 上邊界 UpperBound:表達了泛型的類型必需是某種類型的或者某種類型的子類,語法為 <:這里的一個新的現象是對類型進行限定;(自己或者是於你自己) < identifier : upper bound - the highest acceptable class type > 
      “A is less than B ... A is under B ... A is a subtype of B.”
    2. 下邊界 LowerBound:表達了泛型的類型必需是某種類型的或者某種類型的父類,語法為 >:這里的一個新的現象是對類型進行限定;(自己或者是於你自己) < identifier : lower bound - the lowest acceptable class type >


      這個例子表明:The highest acceptable class type 是 Person,所以要求傳入的參數一定是 Person 或者是 Person 的子類 (即 Worker)

      如果傳進來的不是 Person類或者是 Worker 類,會編譯有錯
  3. View Bounds,可以進行某種神祕的轉換,把你的類型可以在沒有知覺的情況下轉換成目標類型,其實你可以認為 View Bounds 是上邊界和下邊界的加強補充版本,例如在 SparkContext 這個 Spark 的核心類中有 T <% Writable 方式的代碼,這個代碼所表達的是 T 必需是 Writable 類型的 (the highest acceptable class type is Writable),但是 T 又沒有自己继承至 Writable 接口,此時就需要通過 “implicit” 的方式來實現這個功能。

    第一點:寫出 Person, Worker and Dog 之間的继承結構,Worker 是继承 Person (Person 是父類、Worker 是子類),Dog 跟 Person 沒有任何關係;
    第二點:判断 class Cub 的 Type Variance 是什麼,在這個例子是 [ T <% Person ],意思是接受所有继承著 Person 的子類或者 Person 本身,也就是說在這例子中接受 Person 或者是 Person 的子類, 即 Worker;
    第三點:检查参数的正确性,如果T本身是Person,那就是可以传入Person和Worker;如果T本身是Worker,那就是只可以传入Worker,但需求是要傅入 Dog 類 ,因為這個是 View Bound 所以可以用隐式转换 Implicit,Dog 因為跟 Person 沒有任何關係,它會找關鍵字 Implicit 來判斷自己是否可以轉換成 Person 類! implicit def dog2Person(dog: Dog) = new Person(dog.name),找到了它會自動轉換成 Person 類然後傅入 communicate 這個方法里!隐式转换成功!
  4. T: ClassTag,例如 Spark 源碼中的 RDD class RDD[T: ClassTag] 這個其實也是一種類型轉換系統,只是在編譯的時候類型信息不夠,需要借助 JVM 的 runtime 來通過運行時信息來獲得完整的類型信息,這在 Spark 中是非常重要的,因為 Spark 的程序的編寫和運行是區分了 Driver 和 Executor 的,只有在運行的時候才知道完整的類型信息。

  5. 协变与逆变:[-T] 和 [+T] e.g. Expert 是Engineer 的子類,所以逆变 covariant 是自己/ 自己以下的子類;逆变 contravariant 是自己/ 自己以上的父類
    以下是协变的例子:

    第一點:寫出 Engineer 跟 Expert 之間的继承結構,Expert 是继承 Engineer (Engineer 是父類、Expert 是子類);
    第二點:判断 class Meeting 的 Type Variance 是什麼,在這個例子是 [+T],意思是接受所有继承著 T 的子類或者 T 本身,也就是說在這例子中接受 Engineer 或者是 Engineer 的子類, 即 Expert;
    第三點:判断方法需要传入的类型是什么,在这例子要求传入的是 Meeting[Engineer]
    第四點:检查参数的正确性,如果T本身是Engineer,那就是可以传入Engineer和Expert;如果T本身是Expert,那就是只可以传入Expert,如果有此時传入 Engineer,会编译错误!

    以下是逆变的例子:
    第一點:寫出 Engineer 跟 Expert 之間的继承結構,Expert 是继承 Engineer (Engineer 是父類、Expert 是子類);
    第二點:判断 class Meeting 的 Type Variance 是什麼,在這個例子是逆变 [-T],意思是接受所有 T 本身或者是 T 的父類,也就是說在這例子中只接受 Engineer ;
    第三點:判断方法需要传入的类型是什么,在这例子要求传入的是 Meeting[Engineer]
    第四點:检查参数的正确性, 如果 T 本身是 Expert, 那就是可以传入Engineer和Expert;如果 T 本身是 Engineer, 那就是只可以传入 Engineer;如果有此時传入 Expert,会编译错误!

  6. Context Bound,T: Ordering 这种语法必顺能够编程 Ordering[T] 这种方式。

Reference: Programming Scala Chapter 10

Suppose a method takes an arguments of type List[AnyRef], can you pass a List[String] value (Should a List[String] be considered as a subtype List[AnyRef]. If true, this kind of variance is called covariance. We can also have types that are contravariant, where X[String] is a super-type of X[Any].

For covariance type parameters, + is used

For contravariant type parameters, - is used

covariance

invariance

contravariant

[+A]:自己/自己的子類

[A]:自己

[-A]:自己/自己的父類

What is the difference between Type Variance, View Bound and Context Bound?

Why we need to apply the Type System in Programming? What are the pros and cons?

时间: 2024-12-28 00:55:32

大数据Spark蘑菇云前传第15课:Scala类型参数编程实战及Spark源码鉴赏(学习笔记)的相关文章

大数据Spark蘑菇云前传第16课:Scala implicits编程彻底实战及Spark源码鉴赏(学习笔记)

本課課程: Spark源码中的Scala的 implicit 的使用 Scala的 implicit 编程操作实战 Scala的 implicit 企业级最佳实践 Spark源码中的Scala的 implicit 的使用 這個東西意義非常重大,RDD 本身沒有所謂的 Key, Value,只不過是自己本身解讀的時候把它變成 Key Value 的方法去解讀,RDD 本身就是一個 Record. RDD 本身沒有 reduceByKey,它是用了隐式转换,转换了PairRDDPartition 類

分享《Python数据可视化编程实战》+PDF+源码+Igor Milovanovic+颛清山

下载:https://pan.baidu.com/s/1R6n3aE2_jIGnOmFR7jKx0A 更多分享资料:http://blog.51cto.com/14087171 <Python数据可视化编程实战>中文版PDF+英文版PDF+源代码 中文版PDF,带目录和书签:英文版PDF,带目录和书签:中英文两版可以对比学习.配套源代码:经典书籍,讲解详细:中文版如图: 原文地址:http://blog.51cto.com/14087171/2321650

第88课:Spark Streaming从Flume Poll数据案例实战和内幕源码解密

本节课分成二部分讲解: 一.Spark Streaming on Polling from Flume实战 二.Spark Streaming on Polling from Flume源码 第一部分: 推模式(Flume push SparkStreaming) VS 拉模式(SparkStreaming poll Flume) 采用推模式:推模式的理解就是Flume作为缓存,存有数据.监听对应端口,如果服务可以链接,就将数据push过去.(简单,耦合要低),缺点是SparkStreaming

第88课:Spark Streaming从Flume Pull数据案例实战及内幕源码解密

本节课分成二部分讲解: 一.Spark Streaming on Pulling from Flume实战 二.Spark Streaming on Pulling from Flume源码解析 先简单介绍下Flume的两种模式:推模式(Flume push to Spark Streaming)和 拉模式(Spark Streaming pull from Flume ) 采用推模式:推模式的理解就是Flume作为缓存,存有数据.监听对应端口,如果服务可以连接,就将数据push过去.(简单,耦

(X6支持https)2017年9月15日友价T5X6商城站长交易源码仿互站送手机版程序8套模版

(https专版)2017年9月15日友价T5X6商城站长交易源码仿互站送手机版程序8套模版 修复官方版本的各种问题,, 安装步骤,1.将源码上传到主机,2.专入数据库文件.依次导入codes_170915.sql codes_data.sql codes_data_city.sql后台用户名密码: admin admin123 友价源码 X620170915补丁(主要修复https SSL及兼容问题) 以下是本次补丁的升级内容: 1.修复https微信登录功能2.手机版SSL错误,兼容http

第66讲:Scala并发编程实战初体验及其在Spark源码中的应用解析

王家林亲授<DT大数据梦工厂>大数据实战视频“Scala深入浅出实战经典”视频.音频和PPT下载!第66讲:Scala并发编程实战初体验及其在Spark源码中的应用解析百度云:http://pan.baidu.com/s/1pJ5jzHx腾讯微云:http://url.cn/aSawrm360云盘:http://yunpan.cn/cctL3QYACaVNa  访问密码 c0fb 信息来源于 DT大数据梦工厂微信公众账号:DT_Spark

Spark技术内幕:Master基于ZooKeeper的High Availability(HA)源码实现

如果Spark的部署方式选择Standalone,一个采用Master/Slaves的典型架构,那么Master是有SPOF(单点故障,Single Point of Failure).Spark可以选用ZooKeeper来实现HA. ZooKeeper提供了一个Leader Election机制,利用这个机制可以保证虽然集群存在多个Master但是只有一个是Active的,其他的都是Standby,当Active的Master出现故障时,另外的一个Standby Master会被选举出来.由于

第三季-第15课-信号通讯编程

第15课-信号通讯编程 15.1 核心理论 1. 信号 在古老的战场上,信号是最有效,最直接的通讯方式:在linux系统中,信号(signal)同样也是最古老的进程间通讯机制. 2. 信号处理流程 进程A/内核---(1)选择信号-----(2)发送信号-----(3)处理信号----进程B. 3. 信号类型 Linux系统支持的所有信号均定义在/usr/include/asm/signal.h(展示),其中常见的信号有: SIGKILL:杀死进程 SIGSTOP:暂停进程 SIGCHLD:子进

DT大数据梦工厂第三十五课 Spark系统运行循环流程

本节课内容: 1.     TaskScheduler工作原理 2.     TaskScheduler源码 一.TaskScheduler工作原理 总体调度图: 通过前几节课的讲解,RDD和DAGScheduler以及Worker都已有深入的讲解,这节课我们主要讲解TaskScheduler的运行原理. 回顾: DAGScheduler面向整个Job划分多个Stage,划分是从后往前的回溯过程:运行时从前往后运行的.每个Stage中有很多任务Task,Task是可以并行执行的.它们的执行逻辑完