隱式轉(zhuǎn)換的作用:偷偷的對(duì)某一個(gè)類(lèi)進(jìn)行增強(qiáng)(添加某一個(gè)方法)
隱式轉(zhuǎn)換通用格式
1与斤、通常需要一個(gè)增強(qiáng)的類(lèi),例如RichRDD
2荚恶、一個(gè)已經(jīng)存在的類(lèi)撩穿,例如RDD代碼演示
增強(qiáng)的類(lèi)
package com.soul.implict
import org.apache.spark.rdd.RDD
/**
* 為RDD添加一個(gè)打印數(shù)據(jù)的增加類(lèi)
*/
class RichRDD[T](var rdd: RDD[T]) {
def printInfo(flag: Int): Unit = {
if (flag == 0) {
rdd.collect().foreach(println)
}
}
}
為RDD添加這個(gè)增強(qiáng)類(lèi)的功能
package com.soul.implict
import org.apache.spark.rdd.RDD
object ImplictAspect {
implicit def rdd2RichRDD[T](rdd: RDD[T]):RichRDD[T]= new RichRDD[T](rdd)
}
- 通用公式為
implicit def <已存在的類(lèi)>2<增強(qiáng)的類(lèi)>(傳進(jìn)來(lái)存在類(lèi)):返回增強(qiáng)的類(lèi) = new 增強(qiáng)的類(lèi)(傳進(jìn)來(lái)存在的類(lèi))
- Spark源碼中的隱式轉(zhuǎn)換
例如:RDD的ReduceByKey算子就是通過(guò)隱式轉(zhuǎn)換獲取了PairRDDFunctions的方法
implicit def rddToPairRDDFunctions[K, V](rdd: RDD[(K, V)])
(implicit kt: ClassTag[K], vt: ClassTag[V], ord: Ordering[K] = null): PairRDDFunctions[K, V] = {
new PairRDDFunctions(rdd)
}