一、说明

  • 在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|
+---+-------+---------+
Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐