简述UDF/UDAF/UDTF是什么,各自解决问题及应用场景 - 玩转大数据 - 博客园
自定义UDF和UDTF函数的两个作用点:
1.埋点log打印日志,方便任务出现问题后进行调试
2.有一些SQL解决不了的问题,可以通过java代码实现UDF\UDTF函数来辅助解决
-
UDF
-
实现步骤(Java创建自定义UDF类)
- 自定义一个java类
- 继承UDF类
- 重写evaluate方法
- 打包类所在项目成一个all-in-one的jar包并上传到hive所在机器
- 在hive中执行add jar操作,将jar加载到classpath中。
- 在hive中创建模板函数,使得后边可以使用该函数名称调用实际的udf函数
- hive sql中像调用系统函数一样使用udf函数
- UDF函数属于一对一的关系,对一个集合中的每一数据进行一个操作,得到等量的结果,在具体的使用中比如对一组数据中的一个字段数据进行一个加密操作,或者是将一整组数据大写改成小写
UDTF
实现步骤
- 自定义一个java类
- 继承UDAF类
- 内部定义一个静态类,实现UDAFEvaluator接口
- 实现方法init,iterate,terminatePartial,merge,terminate,共5个方法. 详见下图
- 在hive中执行add jar操作,将jar加载到classpath中。
- 在hive中创建模板函数,使得后边可以使用该函数名称调用实际的udf函数
-
hive sql中像调用系统函数一样使用udaf函数
UDTF函数是一个一对多的关系,由一个参数得到多个结果,在具体的使用中包括有对一组数据进行一个行转列的列式存储的一个转化,在SQL对应的方法是explod
UDAF函数
属于多对一的关系,他具体的使用比如是在行式存储列转行的时候使用,将多行转换成一行
在SQL中对应的方法是 collect_list、collect_set
collect_list和collect_set之间的区别点在于collect_set是去重的,而collect_list是不去重的