前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >2021年大数据Spark(三十):SparkSQL自定义UDF函数

2021年大数据Spark(三十):SparkSQL自定义UDF函数

作者头像
Lansonli
发布2021-10-09 16:55:20
2.1K0
发布2021-10-09 16:55:20
举报
文章被收录于专栏:Lansonli技术博客Lansonli技术博客

自定义UDF函数

     无论Hive还是SparkSQL分析处理数据时,往往需要使用函数,SparkSQL模块本身自带很多实现公共功能的函数,在org.apache.spark.sql.functions中。SparkSQL与Hive一样支持定义函数:UDF和UDAF,尤其是UDF函数在实际项目中使用最为广泛。

回顾Hive中自定义函数有三种类型:

第一种:UDF(User-Defined-Function) 函数

一对一的关系,输入一个值经过函数以后输出一个值;

在Hive中继承UDF类,方法名称为evaluate,返回值不能为void,其实就是实现一个方法;

第二种:UDAF(User-Defined Aggregation Function) 聚合函数

多对一的关系,输入多个值输出一个值,通常与groupBy联合使用;

第三种:UDTF(User-Defined Table-Generating Functions) 函数

一对多的关系,输入一个值输出多个值(一行变为多行);

用户自定义生成函数,有点像flatMap;

注意

目前来说Spark 框架各个版本及各种语言对自定义函数的支持:

在SparkSQL中,目前仅仅支持UDF函数和UDAF函数:

UDF函数:一对一关系;

UDAF函数:聚合函数,通常与group by 分组函数连用,多对一关系;

由于SparkSQL数据分析有两种方式:DSL编程和SQL编程,所以定义UDF函数也有两种方式,不同方式可以在不同分析中使用。

SQL方式

     使用SparkSession中udf方法定义和注册函数,在SQL中使用,使用如下方式定义:

DSL方式

    使用org.apache.sql.functions.udf函数定义和注册函数,在DSL中使用,如下方式:

代码演示

代码语言:javascript
复制
package cn.itcast.sql

import org.apache.spark.SparkContext
import org.apache.spark.sql.expressions.UserDefinedFunction
import org.apache.spark.sql.{DataFrame, SparkSession}

/**
 * Author itcast
 * Desc
 * 将udf.txt中的单词使用SparkSQL自定义函数转为大写
 * hello
 * haha
 * hehe
 * xixi
 */
object UDFDemo {
  def main(args: Array[String]): Unit = {
    //1.准备环境
    val spark: SparkSession = SparkSession.builder().appName("UDFDemo").master("local[*]").getOrCreate()
    val sc: SparkContext = spark.sparkContext
    sc.setLogLevel("WARN")
    import spark.implicits._

    //2.加载数据
    val df: DataFrame = spark.read.text("data/input/udf.txt")
    df.show()
    /*
    +-----+
    |value|
    +-----+
    |hello|
    | haha|
    | hehe|
    | xixi|
    +-----+
     */

    //3.使用自定义函数将单词转为大写

    //SQL风格-自定义函数
    //spark.udf.register("函数名",函数实现)
    spark.udf.register("small2big", (value: String) => value.toUpperCase())

    df.createOrReplaceTempView("t_words")
    val sql: String =
      """
        |select value,small2big(value) as small_word
        |from t_words
        |""".stripMargin
    spark.sql(sql).show() //如果没有自定义该函数,那么会报错:Undefined function: 'small2big'.

    //DSL风格-自定义函数
    //val small2big2: UserDefinedFunction = functions.udf((value: String) => value.toUpperCase)
    import org.apache.spark.sql.functions._
    val small2big2: UserDefinedFunction = udf((value: String) => value.toUpperCase)
    df.select($"value", small2big2($"value").as("small_word")).show()
  }
}
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2021-04-18 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 自定义UDF函数
    • 第一种:UDF(User-Defined-Function) 函数
      • 第二种:UDAF(User-Defined Aggregation Function) 聚合函数
        • 第三种:UDTF(User-Defined Table-Generating Functions) 函数
          • SQL方式
            • DSL方式
              • 代码演示
              相关产品与服务
              数据库
              云数据库为企业提供了完善的关系型数据库、非关系型数据库、分析型数据库和数据库生态工具。您可以通过产品选择和组合搭建,轻松实现高可靠、高可用性、高性能等数据库需求。云数据库服务也可大幅减少您的运维工作量,更专注于业务发展,让企业一站式享受数据上云及分布式架构的技术红利!
              领券
              问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档