1. Hive自带了一些函数,比如:max/min等,但是数量有限,自己可以通过自定义 UDF来方便的扩展。
  2. 当 Hive提供的内置函数无法满足你的业务处理需要时,此时就可以考虑使用用户自定义函数。

1. 自定义函数种类

虽然hive中为我们提供了很多的内置函数,但是在实际工作中,有些情况下hive提供的内置函数无法满足我们的需求,就需要我们自己来手动编写,所以就有了自定义函数 UDF。

UDF分为三种,分别如下:

  1. UDF(User-Defined-Function):

一进一出(输入一行,输出一行),
输入一行数据, 输出一行数据; 比如:upper()、lowser()等。

  1. UDAF(User-Defined Aggregation Funcation)

多进一出(输入多行,输出一行),
输入多行数据, 聚合成一行数据, 比如:avg()、sum()等。

  1. UDTF(User-Defined Table-Generating Functions)

一进多出(输入一行,输出多行),
比如:collect_set()、collect_list()等。

官方文档:https://cwiki.apache.org/confluence/display/Hive/HivePlugins

注意: 使用自定义函数需要引入hive-exec的依赖

<dependency><groupId>org.apache.hive</groupId><artifactId>hive-exec</artifactId><version>3.2.1</version>
</dependency>

2. 编写自定义UDF函数

UDF, 输入数据是一行数据, 输出数据也是一行数据,

在此, 我们编写UDF实现给定字符串, 返回字符串的长度, my_len();

2.1 编写UDF的步骤

  1. 继承org.apache.hadoop.hive.ql.udf.generic.*GenericUDF*
  • 之前的版本是继承UDF类, 这个类已经过时了.
  1. 从GenericUDF, 继承了三个方法, 进行重写

    1. , 设置在explain执行计划中显示的语句.
  2. 打包, 本地部署就放到本地任意目录, 非本地模式, 就放入到共享存储, 如HDFS上。

  3. 添加Jar包, 创建函数

    1. 在hive的命令行窗口创建函数
    1. 添加jar
    1. add jar /路径
    1. 创建function
    1. create temporary function 函数名 as "自定义udf类的全类名"
    2. 临时函数用于解决一些临时特殊的业务需求而开发的函数,hive中注册的临时函数只在当前会话可用,注册函数的时候用temporary关键字声名。
  4. 使用函数

    1. 在hive的命令行窗口使用函数;
  5. 删除函数

    1. Drop [temporary] function [if exists] [dbname.]function_name;

2.2 参考代码

//import org.apache.hadoop.hive.ql.exec.UDF;   已经过期
import org.apache.hadoop.hive.ql.exec.UDFArgumentException;
import org.apache.hadoop.hive.ql.metadata.HiveException;
import org.apache.hadoop.hive.ql.udf.generic.GenericUDF;
import org.apache.hadoop.hive.serde2.objectinspector.ObjectInspector;
import org.apache.hadoop.hive.serde2.objectinspector.primitive.PrimitiveObjectInspectorFactory;public class GetLen extends GenericUDF {@Override//校验数据参数个数等初始化操作public ObjectInspector initialize(ObjectInspector[] arguements) throws UDFArgumentException {if(arguements.length != 1){throw new UDFArgumentException("错误, 输入参数不为1 !");}//函数本身返回值为int,需要返回int类型的鉴别器对象, 记不住的话就去GenericUDF中找一个方法参考下写法即可return PrimitiveObjectInspectorFactory.javaIntObjectInspector;}/***函数的逻辑处理* @param arguements 函数的参数* @return 返回值* @throws HiveException*/@Overridepublic Object evaluate(DeferredObject[] arguements) throws HiveException {//1. 取出输入的参数值, 转为stringString str = arguements[0].get().toString();//返回长度, 为了避免null 的string还要进行一个判断return str == null ? 0 : str.length();}@Overridepublic String getDisplayString(String[] strings) {return null;}
}

3. 编写自定义UDTF函数

UDTF, 输入一行数据, 输出多行数据

在此, 我们实现一个字符串切割函数, 给定一行字符串, 按照指定的分隔符进行切分, 并输出。

3.1 编写UDTF的步骤

  1. 继承org.apache.hadoop.hive.ql.udf.generic.*GenericUDTF*

    1. 之前的版本是继承UDTF类, 这个类已经过时了.
  2. 从GenericUDTF, 继承了三个方法, 进行重写

  3. 打包, 本地部署就放到本地任意目录, 非本地模式, 就放入到共享存储, 如HDFS上。

  4. 添加Jar包, 创建函数

    1. 在hive的命令行窗口创建函数
    1. 添加jar
    1. add jar /路径
    1. 创建function
    1. create temporary function 函数名 as "自定义udf类的全类名"
    2. 临时函数用于解决一些临时特殊的业务需求而开发的函数,hive中注册的临时函数只在当前会话可用,注册函数的时候用temporary关键字声名。
  5. 使用函数

    1. 在hive的命令行窗口使用函数;
  6. 删除函数

    1. Drop [temporary] function [if exists] [dbname.]function_name;

3.2 参考代码

import org.apache.hadoop.hive.ql.exec.UDFArgumentException;
import org.apache.hadoop.hive.ql.metadata.HiveException;
import org.apache.hadoop.hive.ql.metadata.PrimaryKeyInfo;
import org.apache.hadoop.hive.ql.udf.generic.GenericUDTF;
import org.apache.hadoop.hive.serde2.objectinspector.ObjectInspector;
import org.apache.hadoop.hive.serde2.objectinspector.ObjectInspectorFactory;
import org.apache.hadoop.hive.serde2.objectinspector.StructObjectInspector;
import org.apache.hadoop.hive.serde2.objectinspector.primitive.PrimitiveObjectInspectorFactory;import java.util.ArrayList;
import java.util.List;public class SplitString extends GenericUDTF {//全局变量, 用于存储要写出个每一个单词private List<String> outputList = null;@Overridepublic StructObjectInspector initialize(StructObjectInspector argOIs) throws UDFArgumentException {//SQL 查询输出数据的默认列名List<String> fieldsName = new ArrayList<>();fieldsName.add("word");//输出数据的类型List<ObjectInspector> fieldsOIs = new ArrayList<>();fieldsOIs.add(PrimitiveObjectInspectorFactory.javaStringObjectInspector);//最终返回值return ObjectInspectorFactory.getStandardStructObjectInspector(fieldsName, fieldsOIs);}//处理输入数据的方法@Overridepublic void process(Object[] arguments) throws HiveException {//1. 获取第一个参数, 也就是待分割字符串String targetString = arguments[0].toString();//2. 获取第二个参数, 也就是切分字符String splitKey = arguments[1].toString();//3. 执行分割String[] strings = targetString.split(splitKey);//一进多出, 就像是使用map或者reduce过程的写出  context.write(key,value)// 只不过hive中是forward方法for(String str : strings){//要输出的是一个个的单词, 每次遍历都把这个单词放入list//然后使用forward方法写出outputList.clear();outputList.add(str);forward(outputList);}}//收尾方法@Overridepublic void close() throws HiveException {}
}

补充文章:
https://blog.csdn.net/HG_Harvey/article/details/77688735
https://cloud.tencent.com/developer/article/1733568

Hive 自定义函数编写(UDF,UDAF,UDTF)相关推荐

  1. udf函数(udf udaf udtf)

    UDF的定义 UDF(User-Defined Functions)即是用户定义的hive函数.hive自带的函数并不能完全满足业务需求,这时就需要我们自定义函数了 UDF的分类 UDF:one to ...

  2. 深入学习《Programing Hive》:Hive自定义函数之UDF

    为了满足用户的个性化需求,Hive被设计成了一个很开放的系统,很多内容都可以定制,主要包括: 1).文件格式: 2).内存中的数据格式,如Hadoop的Writable/Text: 3).用户提供的M ...

  3. Hive 之 用户自定义函数 UDF UDAF UDTF

    一 什么是UDF UDF是UserDefined Function 用户自定义函数的缩写.Hive中除了原生提供的一些函数之外,如果还不能满足我们当前需求,我们可以自定义函数. 除了UDF 之外,我们 ...

  4. hive自定义函数UDF的使用方法

    虽然Hive已经提供了很多内置的函数,比如count().sum(),但是还是不能满足用户的需求,因此提供了自定义函数供用户自己开发函数来满足自己的需求.本实例通过编写自己的UDF,实现通过一个人的出 ...

  5. hive的udf,udaf,udtf各自依賴兩種class(转载+分析整理)

    Hive自定义函数包括三种UDF.UDAF.UDTF 名稱縮寫 特點 依賴 UDF(User-Defined-Function) 一进一出 org.apache.hadoop.hive.ql.exec ...

  6. Hive常用函数、列转行与行转列、开窗函数、UDF、UDTF

    Hive函数.开窗函数.UDF.UDTF 1.系统内置函数 2.常用函数 2.1.关系运算 2.2.数值运算 2.3.条件函数 2.4.日期函数 2.5.字符串函数 2.6.Hive求WordCoun ...

  7. Hadoop生态圈-Hive的自定义函数之UDF(User-Defined-Function)

    Hadoop生态圈-Hive的自定义函数之UDF(User-Defined-Function) 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 转载于:https://www.cnb ...

  8. 2021年大数据Hive(八):Hive自定义函数

    全网最详细的Hive文章系列,强烈建议收藏加关注! 后面更新文章都会列出历史文章目录,帮助大家回顾知识重点. 目录 系列历史文章 前言 Hive自定义函数 一.概述 1.UDF(User-Define ...

  9. udf,udaf,udtf之间的区别

    1.UDF:用户定义(普通)函数,只对单行数值产生作用: 继承UDF类,添加方法 evaluate() /*** @function 自定义UDF统计最小值* @author John**/publi ...

最新文章

  1. 阅读笔记:Item-based Collaborative Filtering Recommendation Algorithms
  2. php网站挂linux,Linux环境下php实现给网站截图的方法
  3. word 2007 中插入图片无法显示,只能显示底部一部分
  4. 网络对抗技术—-网络对抗实验四
  5. Xvfb 虚拟现实库 之 Python 虚拟桌面 pyvirtualdisplay
  6. 使用ZeroTier搭建大局域网利用VNC远程桌面
  7. transformers PreTrainedTokenizer
  8. Html显示缩略图点击展示,JS点击缩略图整屏居中放大图片效果
  9. css 删除线_寻创意|线描画:树
  10. SQL中 UNION 和 UNION ALL 操作符小结
  11. Ribbon风格下,依然叫菜单或者菜单卡、菜单页
  12. js获取当前服务器信息,js获取当前URL、参数、端口、IP等服务器信息
  13. C语言实现 Base64 和 Base32 编解码
  14. doc 和docx的区别
  15. 开发者分享 | AXI 基础第 3 讲-使用 AXI VIP 作为 AXI4 主 (Master) 接口的协议检查工具...
  16. My Fifty-Sixth Page - 子集Ⅱ - By Nicolas
  17. 这18个网站能让你的页面背景炫酷起来
  18. 2012年信息系统项目管理师下半年上午考试习题与答案解析
  19. 阿昆同学的Java学习日记Day5
  20. C# 小数位修约(保留小数位有效数位)

热门文章

  1. 遇到视频聊天软件 v2.2.35
  2. excel操作模块Openpyxl
  3. 原装世嘉土星手柄(Sega Saturn)转USB小板,软硬件全开源
  4. 复现KM3D:Monocular 3D Detection with Geometric Constraints Embedding and Semi-supervised Training
  5. 开源 iOS 项目分类索引大全
  6. 好听的歌曲~~~推荐
  7. 第十一届蓝桥杯大赛软件类决赛(2020javaB国赛)
  8. 听了让人心静的纯音乐
  9. springweb项目连接数据库的时候报错Access denied for user ‘cyy‘@‘192.168.56.1‘ (using password: YES)
  10. 编程中常见的Foo是什么意思