標籤:
本課課程:
- Spark源碼中的Scala的 implicit 的使用
- Scala的 implicit 編程操作實戰
- Scala的 implicit 企業級最佳實務
Spark源碼中的Scala的 implicit 的使用這個東西意義非常重大,RDD 本身沒有所謂的 Key, Value,只不過是自己本身解讀的時候把它變成 Key Value 的方法去解讀,RDD 本身就是一個 Record。 RDD 本身沒有 reduceByKey,它是用了隱式轉換,轉換了PairRDDPartition 類裡的 reduceByKey 方法它只看類型,看到自己需要的是 RDD,然後返回的是代碼需要的 PairRDDFunction ,就會調用這個隱式轉換的方法。 如果源對象、目標對象、伴生類、伴生對象都找不到這個隱式轉換的話,就需要手動把它導進來,這對於代碼的重構也是非常重要的。
Scala的 implicit 編程操作實戰隱式轉換有很多不同的部份,包括隱式參數、隱式轉換、隱式類和隱式對象,隱式轉換是 Scala 的特色。Scala 語言因為有隱式轉換所以有出錯之前會判斷一下自己的伴生對象裡面有無 implicit 這種意義中可以出皇軍團能力的功能,如果有的話它就會調用隱式轉換的方法來完成這次轉換。
Scala 隱式轉換有以下幾個方法
- 在伴生對象裡創建隱式轉換的方法:
class Man 本身沒有 makeMiracles 的方法,如果想調用的話根本不可能。
創建一個 Man 的 Object,如果在 Man 自己的伴生對象中加入了 implicit 的功能,它會在報錯的最後一刻找自己的伴生對象裡的功能!看看有沒有隱式轉換的方法,發現有了!就會自動有 makeMiracles 的方法。隱式轉換的成功!在這裡是加入隱式轉換的功能,意義上是擴展了 class Man 的功能
- 直接導入 implicit 的方法,在這個 SparkSQL 的例子中 implicit 是一個 object,
在以下例子,也是首先創建了一個 implicit 的 object,然後把這個類的功能 import 進來,然後 man 也可以根據 implicit object 裡的功能進行隱式轉換。
- 隱式參數,可以代為一個默認參數那樣把參數傳進去
先寫一個 Function: def talk(name: String)(implicit content: String) = println(name + " : " + content),第2個參數是一個隱式參數,然後調用 talk 方法,如果沒有隱式參數的話編譯器會報異常!此時,就可以定義一個隱式參數,這樣隱式轉換成功啦!
大資料Spark蘑菇雲前傳第16課:Scala implicits編程徹底實戰及Spark源碼鑒賞(學習筆記)