Hive中用户自定义函数UDF、UDAF、UDTF的定义以及UDF具体实现

前言

        在Hive学习中,我们刚接触到用户自定义函数可能会有点不理解,下面我就根据我所知的来给跟我遇到过同样问题的人一点帮助。

目录

前言

简单定义

UDF具体实现预应用

运用


简单定义

UDF,源自于英文user-defined function。

我们根据函数输入输出的行数可以将其分为三类:UDF、UDAF、UDTF(不仅适用于用户自定义函数)

UDF:普通函数,特点是一进一出。例如取整函数round,接收一行数据,输出一行数据。

UDAF:聚合函数,A即Aggregation聚合的意思,特点是多进一出。可以简单理解为把一堆数据收集起来处理,输出一个统一结果。像count、sum、min、max以及数据收集函数collect_set()和collect_list等都属于聚合函数。

UDTF:表生成函数,T即Table-Generating表生成的意思,特点是一进多出。这种类型的函数作用返回的结果类似于表,同时UDTF也是我们接触比较少的函数。


UDF具体实现预应用

其实UDF的应用并不难,我大致分为以下几个步骤:

第一步:在IDEA中创建一个maven工程,写一个类继承UDF,并重载evaluate方法,方法中实现函数的业务逻辑。重载也意味着可以在一个java类中实现多个函数功能。

第二步:程序打成jar,上传到HDFS上(不会打包的可以看下面图)

第三步:客户端命令行中添加jar包到Hive的classpath,命令:

add jar /xxx/udf.jar;

(classpath 可以用于指定其他依赖项的位置,比如自定义的 UDF(用户自定义函数)或外部的 JAR 文件等。通过将这些依赖项添加到 classpath 中,Hive 可以在运行时访问它们。)

第四步:注册成为临时函数,命令:

create temporary function 函数名 as 'UDF类全路径';

(虽然第三步中将 UDF 的 JAR 包添加到 classpath中,但仅如此是无法直接使用 UDF 的,还需要将 UDF 注册到 Hive 中,将 UDF 声明为 Hive 可以识别和使用的函数。)

出现OK即代表成功注册,如果出现下面这种情况,则是全包路径出现错误或不一致导致。

运用

如果你上述都没有问题,那么就可以愉快的使用了你自己的udf了,下面是我的运用演示。

  • 10
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
使用SparkSQL和Hive API,可以通过以下步骤实现用户自定义函数UDF)、聚合函数UDAF)和表生成函数UDTF): 1. 编写自定义函数的代码,例如: ``` // UDF def myUDF(str: String): Int = { str.length } // UDAF class MyUDAF extends UserDefinedAggregateFunction { override def inputSchema: StructType = StructType(StructField("value", StringType) :: Nil) override def bufferSchema: StructType = StructType(StructField("count", IntegerType) :: Nil) override def dataType: DataType = IntegerType override def deterministic: Boolean = true override def initialize(buffer: MutableAggregationBuffer): Unit = { buffer(0) = 0 } override def update(buffer: MutableAggregationBuffer, input: Row): Unit = { buffer(0) = buffer.getInt(0) + input.getString(0).length } override def merge(buffer1: MutableAggregationBuffer, buffer2: Row): Unit = { buffer1(0) = buffer1.getInt(0) + buffer2.getInt(0) } override def evaluate(buffer: Row): Any = { buffer.getInt(0) } } // UDTF class MyUDTF extends GenericUDTF { override def initialize(args: Array[ConstantObjectInspector]): StructObjectInspector = { // 初始化代码 } override def process(args: Array[DeferedObject]): Unit = { // 处理代码 } override def close(): Unit = { // 关闭代码 } } ``` 2. 将自定义函数注册到SparkSQL或Hive,例如: ``` // SparkSQL注册UDF spark.udf.register("myUDF", myUDF _) // Hive注册UDF hiveContext.sql("CREATE TEMPORARY FUNCTION myUDF AS 'com.example.MyUDF'") // Hive注册UDAF hiveContext.sql("CREATE TEMPORARY FUNCTION myUDAF AS 'com.example.MyUDAF'") // Hive注册UDTF hiveContext.sql("CREATE TEMPORARY FUNCTION myUDTF AS 'com.example.MyUDTF'") ``` 3. 在SQL语句使用自定义函数,例如: ``` -- 使用SparkSQLUDF SELECT myUDF(name) FROM users -- 使用HiveUDF SELECT myUDF(name) FROM users -- 使用HiveUDAF SELECT myUDAF(name) FROM users GROUP BY age -- 使用HiveUDTF SELECT explode(myUDTF(name)) FROM users ``` 以上就是使用SparkSQL和Hive API实现用户自定义函数UDFUDAFUDTF)的步骤。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值