記錄:Spark有個需求需要把某個ip字段進行點分十進制的轉換,使用自定義函數實現,在此處記錄實現過程
此時的函數僅是scala代碼,無法再DataFrame中使用
上述的udf爲 import org.apache.spark.sql.functions.udf
關鍵代碼
/**
* 將點分ip轉換成十進制
* @param ip
* @return
*/
def ipToLong(ip:String) = {
val arr: Array[String] = ip.split("\\.")
var result:Long =0
var ipl:Long =0
for (i <-0 to3) {
ipl = arr(i).toLong
result |= ipl << ((3 - i) <<3)
}
result
}
/**
* 自定義函數 將點分ip轉換成Long類型的數據
*
* @return 返回值是一個自定義函數
*/
def getIpToLong(): UserDefinedFunction = {
val ipToLong: UserDefinedFunction =udf((ip:String) => {
val arr: Array[String] = ip.split("\\.")
var result:Long =0
var ipl:Long =0
for (i <-0 to3) {
ipl = arr(i).toLong
result |= ipl << ((3 - i) <<3)
}
result
})
ipToLong
}
var ipToLong: UserDefinedFunction =null //自定義函數
ipToLong =getIpToLong//初始化自定義函數
//自定義函數使用示例 其中dim_sqm_iprange_group爲DataFrame
dim_sqm_iprange_group.select(
ipToLong($"ip_start").as("ip_start"),
ipToLong($"ip_end").as("ip_end"),
$"group_type"
)
------------------------------------------------------------------------------------------------------
此爲個人學習筆記