为了账号安全,请及时绑定邮箱和手机立即绑定

Spark自定义函数(1)

标签:
Spark

记录:Spark有个需求需要把某个ip字段进行点分十进制的转换,使用自定义函数实现,在此处记录实现过程

webp

点分十进制转换函数

此时的函数仅是scala代码,无法再DataFrame中使用

webp

Spark自定义函数的点分十进制转换

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

webp

自定义函数初始化

webp

自定义函数使用,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


点击查看更多内容
TA 点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
  • 推荐
  • 评论
  • 收藏
  • 共同学习,写下你的评论
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消