Spark自定義函數(1)

記錄:Spark有個需求需要把某個ip字段進行點分十進制的轉換,使用自定義函數實現,在此處記錄實現過程

點分十進制轉換函數

此時的函數僅是scala代碼,無法再DataFrame中使用

Spark自定義函數的點分十進制轉換

上述的udf爲 import org.apache.spark.sql.functions.udf

自定義函數初始化
自定義函數使用,dim_sqm_iprange_group爲DataFrame

關鍵代碼

/**

* 將點分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"

)

------------------------------------------------------------------------------------------------------

此爲個人學習筆記

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章