记录: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"
)
------------------------------------------------------------------------------------------------------
此为个人学习笔记
作者:利伊奥克儿
链接:https://www.jianshu.com/p/f5694cc5b836