中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

如何進行scala隱式轉換及Spark源碼解析

發布時間:2021-12-03 09:10:07 來源:億速云 閱讀:128 作者:柒染 欄目:云計算

本篇文章為大家展示了如何進行scala隱式轉換及Spark源碼解析,內容簡明扼要并且容易理解,絕對能使你眼前一亮,通過這篇文章的詳細介紹希望你能有所收獲。

隱式轉換,是scala當中一個重要的特性,今天我們結合自己的例子和spark源碼,爭取對隱式轉換有一個更加深入的了解。

關于implicit有3種使用方式,implicit def、implicit class以及implicit 參數

首先看一下implicit def的用法:

object implicitTest {
  class Man(val name: String){
    def work(){println(name + " is working!")}
  }

  class Woman(val name: String){
    def shop(){println(name + " is shopping!")}
  }

  class Child(val name: String){
    def play(){println(name + " is playing!")}
  }

  implicit def manToWoman(man: Man) = new Woman(man.name)
  implicit def manToChild(man: Man) = new Child(man.name)

  def main(args: Array[String]): Unit ={
    val man = new Man("Tom")
    val woman = new Woman("Lily")
    val child = new Child("baby")
    man.work()
    man.shop()
    man.play()
  }
}

在上面的代碼當中,我們定義了3個class,Man、Woman、Child,他們之間沒有任何繼承關系。下面的main函數當中,我們聲明了Man、Woman、Child,各一個實例,我們考慮,作為男人來講,是不是也不一定只能是工作,適當的休閑和娛樂是不是也是可以的。所以我們做了2個隱式轉換的函數,manToWoman和manToChild,需要注意的是,這兩個函數名其實一點都不重要,我們只是希望看起來更容易理解一些,你寫個aaa或者bbb,一點問題都沒有。

編譯過程大概是這樣的:

1、編譯man.shop(),發現并沒有shop方法,即將報錯

2、報錯之前,搜索一下作用域內,有沒有隱式轉換函數,能夠支持man對shop的調用,找到了manToWoman。

3、把man變成woman,調用shop方法

之后再看一下implicit class的用法:

object implicitTest {
  class Man(val name: String){
    def work(){println(name + " is working!")}
  }

  class Woman(val name: String){
    def shop(){println(name + " is shopping!")}
  }

  class Child(val name: String){
    def play(){println(name + " is playing!")}
  }

  implicit class ManConvert(m: Man){
    def shop() = new Woman(m.name).shop()
    def play() = new Child(m.name).play()
  }

  def main(args: Array[String]): Unit ={
    val man = new Man("Tom")
    val woman = new Woman("Lily")
    val child = new Child("baby")
    man.work()
    man.shop()
    man.play()
  }
}

這個當中實現的效果看起來和前一種差不多,其實它的語義是完全不同的。編譯過程大概是這樣的:

1、編譯man.shop(),發現并沒有shop方法,即將報錯

2、報錯之前,搜索一下作用域內,看看有沒有隱式轉換類,能夠為man提供shop方法,找到了ManConvert

3、將man轉換為ManConvert,執行shop方法。

最后我們再看一下implicit參數的用法:

object implicitTest {
  class Man(val name: String){
    def work(){println(name + " is working!")}
    def marry(implicit w: Woman){println(name + " marryed " + w.name)}
  }

  class Woman(val name: String){
    def shop(){println(name + " is shopping!")}
  }

  def main(args: Array[String]): Unit ={
    val man = new Man("Tom")
    implicit val woman = new Woman("Lily")
    man.marry
  }
}

我們為Man增加了一個marry的方法,它的參數w是implicit的,然后調用的時候,我們先在前面聲明了一個implicit 類型的woman,之后調用marry但是不指定參數,這樣是不會報錯得到。但是如果我們在marry的前面聲明了2個implicit的woman,那么marry還是會報錯的。

換成人類的語言來解釋這件事:一個男人要結婚,如果指定結婚對象,那沒問題,如果沒指定,那就看看身邊有沒有適合的結婚對象,有的話,就直接生米煮成熟飯,可是如果身邊有2個,好吧,我也不知道該娶哪個!

結合Spark源碼,我們來深入理解一下implicit,看下面這段代碼:

val rdd = sc.textFile("hdfs://master:9000/woozoom/mavlink1.log", 12).zipWithIndex()
rdd.sortByKey()

看起來是達到目的了,可是這個sortByKey的確切含義究竟是什么,倒序?正序?能不能自定義排序原則?去找一下spark的api文檔吧,找到RDD類,查找sortByKey方法,可是,居然,居然沒有,只有sortBy,沒有sortByKey。懵逼了~~~~~~

直到我了解了implicit這回事,并且在RDD的源碼當中我們找到了下面這段:

  implicit def rddToOrderedRDDFunctions[K : Ordering : ClassTag, V: ClassTag](rdd: RDD[(K, V)])
    : OrderedRDDFunctions[K, V, (K, V)] = {
    new OrderedRDDFunctions[K, V, (K, V)](rdd)
  }

上面我們對scala的implicit做了比較全面的了解,這樣的工作,對scala和spark的學習和理解,非常重要。

但是,我要說但是,凡事都有其兩面性,implicit在帶來代碼的緊湊和精煉的同時,負作用就是可讀性極差;特別是在工作的初級階段,我是強烈不建議我們團隊內部大量的使用implicit。在我看來,多寫兩行代碼,顯式的轉換一下,真的不是什么大事!

上述內容就是如何進行scala隱式轉換及Spark源碼解析,你們學到知識或技能了嗎?如果還想學到更多技能或者豐富自己的知識儲備,歡迎關注億速云行業資訊頻道。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

海城市| 峨眉山市| 托里县| 万安县| 潜江市| 阜阳市| 敖汉旗| 峨眉山市| 霍林郭勒市| 尉氏县| 永清县| 家居| 珲春市| 喀什市| 会宁县| 上虞市| 辰溪县| 重庆市| 大厂| 花莲市| 淄博市| 蓬安县| 资阳市| 乐业县| 汉川市| 扬州市| 夏邑县| 绍兴县| 德兴市| 西安市| 和田县| 吕梁市| 和政县| 大连市| 宜君县| 土默特右旗| 新野县| 太和县| 绿春县| 前郭尔| 乌兰浩特市|