隐式转换的定义
当编译器第一次编译失败的时候,会在当前的环境中查找能让代码编译通过的方法,用于将类型进行转换,实现二次编译
隐式转换的作用
隐式转换可以在不需改任何代码的情况下,扩展某个类的功能。
隐式解析机制
1)说明
(1)首先会在当前代码作用域下查找隐式实体(隐式方法、隐式类、隐式对象)。(一般是这种情况)
(2)如果第一条规则查找隐式实体失败,会继续在隐式参数的类型的作用域里查找。类型的作用域是指与该类型相关联的全部伴生对象以及该类型所在包的包对象。
什么时候用到隐式转换
当我知道这个类中一定存在对应的方法时,我可以采用隐式转换。
举例:我需要将RDD转换为DataFrame
def etlBaseAdLog(ssc:SparkContext,sparkSession: SparkSession)={
import sparkSession.implicits._
ssc.textFile("/user/douglas/ods/baseadlog.log").filter(item =>{
val obj: JSONObject = ParseJsonData.getJsonData(item)
obj.isInstanceOf[JSONObject]
}).mapPartitions(partition=>{
partition.map(item=>{
val jsonObject: JSONObject = ParseJsonData.getJsonData(item)
val adid: Int = jsonObject.getIntValue("adid")
val adname: String = jsonObject.getString("adname")
val dn: String = jsonObject.getString("dn")
(adid,adname,dn)
})
}).toDF().coalesce(1).write.mode(SaveMode.Overwrite).insertInto("dwd.dwd_base_ad")
}
在转换为DF过程中报红,但是我知道sparkSession对象中一定存在对应的转换方法,那么使用隐式转换