spark 用户自定义函数UDF
·
一、说明
- 在Spark中,自定义函数可以分为两种UDF和UDAF(这里只演示UDF)。
- UDF(User-Defined-Function),即最基本的自定义函数。类似 lit、sqrt之类的函数,是对每一条数据处理。输入和输出是一对一的关系。
- UDAF(User- Defined Aggregation Funcation),用户自定义聚合函数。类似sum、count之类的函数,是对数据按一定规则分组之后的聚合处理。输入和输出是多对一的关系。
- 自定义函数的写法有两种,一种需要注册,一种不需要注册,区别在于,非注册的的自定义函数只能与DataFrame算子结合使用,注册的用户自定义函数可以用于DataFrame的临时视图中,也可以与DataFrame算子结合使用。
二、数据集
people.json
{"name":"Michael", "age":16}
{"name":"Andy", "age":30}
{"name":"Justin", "age":19}
{"name":"Justin", "age":29}
{"name":"Michael", "age":46}
三、测试代码
package com.dt.spark.Test
import org.apache.spark.SparkContext
import org.apache.spark.sql.expressions.UserDefinedFunction
import org.apache.spark.sql.{DataFrame, SparkSession}
object UDFTest {
def main(args: Array[String]): Unit = {
val spark: SparkSession = SparkSession.builder().appName("UDFTest").master("local[2]").getOrCreate()
val sc: SparkContext = spark.sparkContext
sc.setLogLevel("WARN")
val df: DataFrame = spark.read.json("data/peoplemanagedata/people.json")
import spark.implicits._
import org.apache.spark.sql.functions._
df.show()
//自定义函数
//字符串转大写
val strToUpper: UserDefinedFunction = udf((str: String) => {
str.toUpperCase()
})
//注册自定义函数
//字符串转小写
val strToLower: UserDefinedFunction = spark.udf.register("strToLower", (str: String) => {
str.toLowerCase()
})
df.withColumn("nameToUpper", strToUpper($"name")).show()
df.withColumn("nameToLower", strToLower($"name")).show()
//创建临时示图
df.createTempView("t1")
spark.sql(s"select *,strToLower(name) from t1").show() //strToLower(name) 括号里只填属性
//spark.sql(s"select *,strToUpper(name) from t1").show() //错误
}
}
四、输出结果
+---+-------+
|age| name|
+---+-------+
| 16|Michael|
| 30| Andy|
| 19| Justin|
| 29| Justin|
| 46|Michael|
+---+-------+
+---+-------+-----------+
|age| name|nameToUpper|
+---+-------+-----------+
| 16|Michael| MICHAEL|
| 30| Andy| ANDY|
| 19| Justin| JUSTIN|
| 29| Justin| JUSTIN|
| 46|Michael| MICHAEL|
+---+-------+-----------+
+---+-------+-----------+
|age| name|nameToLower|
+---+-------+-----------+
| 16|Michael| michael|
| 30| Andy| andy|
| 19| Justin| justin|
| 29| Justin| justin|
| 46|Michael| michael|
+---+-------+-----------+
+---+-------+---------+
|age| name|UDF(name)|
+---+-------+---------+
| 16|Michael| michael|
| 30| Andy| andy|
| 19| Justin| justin|
| 29| Justin| justin|
| 46|Michael| michael|
+---+-------+---------+
更多推荐
所有评论(0)