在Spark中使用分为UDF主要分为两种情况
- 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
- 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 _)
- 给表格 添加多列
可通过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/