(转载)Spark中UDF如何使用

在Spark中使用分为UDF主要分为两种情况

  1. Spark Sql
    分为匿名注册和实名注册两种形式
匿名注册:
spark.udf.register("strLen", (str: String) => str.length())

实名注册:
1> 定义udf
/**
 * 根据年龄大小返回是否成年 成年:true,未成年:false
*/
def isAdult(age: Int) = {
  if (age < 18) {
    false
  } else {
    true
  }
}
2> 注册
spark.udf.register("isAdult", isAdult _)

PS:关于spark.udf和sqlContext.udf

在Spark2.x里,两者实际最终都是调用的spark.udf

  1. DataFrame

DataFrame的udf方法虽然和Spark Sql的名字一样,但是属于不同的类,它在org.apache.spark.sql.functions里,下面是它的用法

import org.apache.spark.sql.functions._
//注册自定义函数(通过匿名函数)
val strLen = udf((str: String) => str.length())
//注册自定义函数(通过实名函数)
val udf_isAdult = udf(isAdult _)
  1. 给表格 添加多列
    可通过withColumn和select使用,给表添加两列的功能
    spark2.x下
/通过withColumn添加列
userDF.withColumn("name_len", strLen(col("name"))).withColumn("isAdult", udf_isAdult(col("age"))).show
//通过select添加列
userDF.select(col("*"), strLen(col("name")) as "name_len", udf_isAdult(col("age")) as "isAdult").show

可通过withColumn的源码看出withColumn的功能是实现增加一列,或者替换一个已存在的列,他会先判断DataFrame里有没有这个列名,如果有的话就会替换掉原来的列,没有的话就用调用select方法增加一列,所以如果我们的需求是增加一列的话,两者实现的功能一样,且最终都是调用select方法,但是withColumn会提前做一些判断处理,所以withColumn的性能不如select好。

注:select方法和sql 里的select一样,如果新增的列名在表里已经存在,那么结果里允许出现两列列名相同但数据不一样,大家可以自己试一下。

文章转载自 伦少的博客
网址链接: https://dongkelun.com/2018/08/02/sparkUDF/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值