HIVE udf、udaf、udtf函数定义与用法(最全!!!!!)

2023-12-22 19:58

本文主要是介绍HIVE udf、udaf、udtf函数定义与用法(最全!!!!!),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

一、定义

1、hive udf、udaf、udtf函数定义与用法

(1)UDF(user-defined function)作用于单个数据行,产生一个数据行作为输出。(数学函数,字符串函数)

(2)UDAF(用户定义聚集函数 User- Defined Aggregation Funcation):接收多个输入数据行,并产生一个输出数据行。(count,max)

(3)UDTF(表格生成函数 User-Defined Table Functions):接收一行输入,输出(explode)

总结:

UDF:返回对应值,一对一  

UDAF:返回聚类值,多对一

UDTF:返回拆分值,一对多

参考链接:

  1. https://help.aliyun.com/document_detail/73359.html?spm=a2c4g.11186623.2.13.2b8a2cd5LReBVx#section-ipk-thf-xdb
  2. http://www.singlex.net/3442.html?kozafo=i5er4

 

二、在odps的实际应用(以python为例)

1、Odps写udf和调用实例

参考链接:https://blog.csdn.net/Andy_shenzl/article/details/106328896

第一步:使用python代码创建udf

具体代码:
#pyton写udf实例
from odps.udf import annotate@annotate("*->bigint")  #虽然这边可以转换格式,但是最好在python代码里还是再次转化下class udf_test_tyq(object):def evaluate(self, sms_text):sms_text = int(sms_text)if sms_text >100 :return sms_text/20return  sms_text +1

第二步:新建函数:需要与第一步的udf函数名对应

 

第三步:调用udf

注意:需要在同一空间调用

 

2、Odps写udaf和调用实例

生成顺序和方法与udf一致,只有生成代码不一致。

结果:

# -*- coding: utf-8 -*-
from odps.udf import annotate
from odps.udf import BaseUDAF@annotate('*->string')  #输入的格式->输出的格式
class UdafTestTyq(BaseUDAF):def new_buffer(self):return []  #返回一个需要生成的格式,这里返回一个空列表,表示下面最终的值返回是一个列表形式,同时中间处理过程中的buffer都是一个列表格式。def iterate(self, buffer, value):if value is not None:buffer.append(value)   #根据python列表的用法写def merge(self, buffer, pbuffer):#相当于reduce过程,简单理解为如果是列表,即将多个列表合并成一个列表即可,buffer始终是最终要输出的,所以最后全部写在buffer中,合并的用法只要正常根据python列表合并的方法即可for p in pbuffer:buffer.append(p)def terminate(self, buffer):return  ",".join(buffer)  #转换为字符串,因为上述annotate定义输出为string格式#---以下为列表中放字典的例子
#import json
#class UdafTestTyq(BaseUDAF):#def new_buffer(self):#return []#def iterate(self, buffer, value):#if value is not None:#buffer.append(json.loads(value))#def merge(self, buffer, pbuffer):#for p in pbuffer:#buffer.append(p)#def terminate(self, buffer):#return json.dumps(buffer ,ensure_ascii=False)#---以下为生成字典的例子
#class JsonUdaf(BaseUDAF):#def new_buffer(self):#return {}#def iterate(self, buffer, key, value):#if key is not None:#buffer[key] = value#def merge(self, buffer, pbuffer):#buffer.update(pbuffer)#def terminate(self, buffer):#return json.dumps(buffer ,ensure_ascii=False)

 

3、Odps写udtf和调用实例

生成顺序和方法与udf一致,只有生成代码不一致。

调用方法:

注意!!udtf的调用方法和其他两个不太一样。

UDTF有两种使用方法,一种直接放到select后面,一种和lateral view一起使用。(UDTF不可以添加其他字段使用,不可以嵌套调用,不可以和group by/cluster by/distribute by/sort by一起使用)

(1)直接放在select 后面实例:

(2)和lateral view一起使用实例:

用lateral view 可以带上其他的字段,更符合实际应用场景。

结果:截图为同一个deviceid

 

这篇关于HIVE udf、udaf、udtf函数定义与用法(最全!!!!!)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/525269

相关文章

MySQL中between and的基本用法、范围查询示例详解

《MySQL中betweenand的基本用法、范围查询示例详解》BETWEENAND操作符在MySQL中用于选择在两个值之间的数据,包括边界值,它支持数值和日期类型,示例展示了如何使用BETWEEN... 目录一、between and语法二、使用示例2.1、betwphpeen and数值查询2.2、be

pandas使用apply函数给表格同时添加多列

《pandas使用apply函数给表格同时添加多列》本文介绍了利用Pandas的apply函数在DataFrame中同时添加多列,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习... 目录一、Pandas使用apply函数给表格同时添加多列二、应用示例一、Pandas使用apply函

Java序列化之serialVersionUID的用法解读

《Java序列化之serialVersionUID的用法解读》Java序列化之serialVersionUID:本文介绍了Java对象的序列化和反序列化过程,强调了serialVersionUID的作... 目录JavChina编程a序列化之serialVersionUID什么是序列化为什么要序列化serialV

python3中正则表达式处理函数用法总结

《python3中正则表达式处理函数用法总结》Python中的正则表达式是一个强大的文本处理工具,用于匹配、查找、替换等操作,在Python中正则表达式的操作主要通过内置的re模块来实现,这篇文章主要... 目录前言re.match函数re.search方法re.match 与 re.search的区别检索

Python中Namespace()函数详解

《Python中Namespace()函数详解》Namespace是argparse模块提供的一个类,用于创建命名空间对象,它允许通过点操作符访问数据,比字典更易读,在深度学习项目中常用于加载配置、命... 目录1. 为什么使用 Namespace?2. Namespace 的本质是什么?3. Namesp

MySQL中如何求平均值常见实例(AVG函数详解)

《MySQL中如何求平均值常见实例(AVG函数详解)》MySQLavg()是一个聚合函数,用于返回各种记录中表达式的平均值,:本文主要介绍MySQL中用AVG函数如何求平均值的相关资料,文中通过代... 目录前言一、基本语法二、示例讲解1. 计算全表平均分2. 计算某门课程的平均分(例如:Math)三、结合

MySQL 中的 JSON_CONTAIN用法示例详解

《MySQL中的JSON_CONTAIN用法示例详解》JSON_CONTAINS函数用于检查一个JSON文档中是否包含另一个JSON文档,这篇文章给大家介绍JSON_CONTAINS的用法、语法、... 目录深入了解 mysql 中的 jsON_CONTAINS1. JSON_CONTAINS 函数的概述2

JDK21对虚拟线程的几种用法实践指南

《JDK21对虚拟线程的几种用法实践指南》虚拟线程是Java中的一种轻量级线程,由JVM管理,特别适合于I/O密集型任务,:本文主要介绍JDK21对虚拟线程的几种用法,文中通过代码介绍的非常详细,... 目录一、参考官方文档二、什么是虚拟线程三、几种用法1、Thread.ofVirtual().start(

Python函数作用域与闭包举例深度解析

《Python函数作用域与闭包举例深度解析》Python函数的作用域规则和闭包是编程中的关键概念,它们决定了变量的访问和生命周期,:本文主要介绍Python函数作用域与闭包的相关资料,文中通过代码... 目录1. 基础作用域访问示例1:访问全局变量示例2:访问外层函数变量2. 闭包基础示例3:简单闭包示例4

Java8 Collectors.toMap() 的两种用法

《Java8Collectors.toMap()的两种用法》Collectors.toMap():JDK8中提供,用于将Stream流转换为Map,本文给大家介绍Java8Collector... 目录一、简单介绍用法1:根据某一属性,对对象的实例或属性做映射用法2:根据某一属性,对对象集合进行去重二、Du