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

举报
Lansonli 发表于 2021/09/29 00:37:21 2021/09/29
【摘要】 目录 自定义UDF函数 第一种:UDF(User-Defined-Function) 函数 第二种:UDAF(User-Defined Aggregation Function) 聚合函数 第三种:UDTF(User-Defined Table-Generating Functions) 函数 SQL方式 DSL方式 代码...

目录

自定义UDF函数

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

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

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

SQL方式

DSL方式

代码演示


自定义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中使用,如下方式:

 

代码演示


  
  1. package cn.itcast.sql
  2. import org.apache.spark.SparkContext
  3. import org.apache.spark.sql.expressions.UserDefinedFunction
  4. import org.apache.spark.sql.{DataFrame, SparkSession}
  5. /**
  6.  * Author itcast
  7.  * Desc
  8.  * 将udf.txt中的单词使用SparkSQL自定义函数转为大写
  9.  * hello
  10.  * haha
  11.  * hehe
  12.  * xixi
  13.  */
  14. object UDFDemo {
  15.   def main(args: Array[String]): Unit = {
  16.     //1.准备环境
  17.     val spark: SparkSession = SparkSession.builder().appName("UDFDemo").master("local[*]").getOrCreate()
  18.     val sc: SparkContext = spark.sparkContext
  19.     sc.setLogLevel("WARN")
  20.     import spark.implicits._
  21.     //2.加载数据
  22.     val df: DataFrame = spark.read.text("data/input/udf.txt")
  23.     df.show()
  24.     /*
  25.     +-----+
  26.     |value|
  27.     +-----+
  28.     |hello|
  29.     | haha|
  30.     | hehe|
  31.     | xixi|
  32.     +-----+
  33.      */
  34.     //3.使用自定义函数将单词转为大写
  35.     //SQL风格-自定义函数
  36.     //spark.udf.register("函数名",函数实现)
  37.     spark.udf.register("small2big", (value: String) => value.toUpperCase())
  38.     df.createOrReplaceTempView("t_words")
  39.     val sql: String =
  40.       """
  41.         |select value,small2big(value) as small_word
  42.         |from t_words
  43.         |""".stripMargin
  44.     spark.sql(sql).show() //如果没有自定义该函数,那么会报错:Undefined function: 'small2big'.
  45.     //DSL风格-自定义函数
  46.     //val small2big2: UserDefinedFunction = functions.udf((value: String) => value.toUpperCase)
  47.     import org.apache.spark.sql.functions._
  48.     val small2big2: UserDefinedFunction = udf((value: String) => value.toUpperCase)
  49.     df.select($"value", small2big2($"value").as("small_word")).show()
  50.   }
  51. }

 

文章来源: lansonli.blog.csdn.net,作者:Lansonli,版权归原作者所有,如需转载,请联系作者。

原文链接:lansonli.blog.csdn.net/article/details/115808039

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。