简述UDF/UDAF/UDTF是什么,各自解决问题及应用场景
UDF
User-Defined-Function 自定义函数 、一进一出;
背景
- 系统内置函数无法解决实际的业务问题,需要开发者自己编写函数实现自身的业务实现诉求。
 - 应用场景非常多,面临的业务不同导致个性化实现很多,故udf很需要。
 
意义
- 函数扩展得到解决,极大丰富了可定制化的业务需求。
 - IO要求-要解决的问题
- in:out=1:1,只能输入一条记录当中的数据,同时返回一条处理结果。
 - 属于最常见的自定义函数,像cos,sin,substring,indexof等均是如此要求
 
 
实现步骤(Java创建自定义UDF类)
- 自定义一个java类
 - 继承UDF类
 - 重写evaluate方法
 - 打包类所在项目成一个all-in-one的jar包并上传到hive所在机器
 - 在hive中执行add jar操作,将jar加载到classpath中。
 - 在hive中创建模板函数,使得后边可以使用该函数名称调用实际的udf函数
 - hive sql中像调用系统函数一样使用udf函数
 
代码实现
- 功能要求:实现当输入字符串超过2个字符的时候,多余的字符以”…”来表示。
 - 如“12”则返回“12”,如“123”返回“12…”
 - 自定义类、继承UDF、重写evaluate方法已在代码中体现
 
import org.apache.hadoop.hive.ql.exec.UDF;
/*
 * 功能:实现当输入字符串超过2个字符的时候,多余的字符以"..."来表示。
 * 输入/输出:* 如“12”则返回“12”,如“123”返回“12..."
 */
public class ValueMaskUDF extends UDF{
       public String evaluate(String input,int maxSaveStringLength,String replaceSign) {
             if(input.length()<=maxSaveStringLength){
                    return input;
             }
             return input.substring(0,maxSaveStringLength)+replaceSign;
       }
       public static void main(String[] args) {
             System.out.println(new ValueMaskUDF().evaluate("河北省",2,"..."));;
       }
}
UDAF
自定义udaf函数self_count,实现系统udaf count的功能
Input/Output要求-要解决的问题
- in:out=n:1,即接受输入N条记录当中的数据,同时返回一条处理结果。
 - 属于最常见的自定义函数,像count,sum,avg,max等均是如此要求
 
实现步骤
- 自定义一个java类
 - 继承UDAF类
 - 内部定义一个静态类,实现UDAFEvaluator接口
 - 实现方法init,iterate,terminatePartial,merge,terminate,共5个方法. 详见下图
 - 在hive中执行add jar操作,将jar加载到classpath中。
 - 在hive中创建模板函数,使得后边可以使用该函数名称调用实际的udf函数
 hive sql中像调用系统函数一样使用udaf函数
Hive_UDAF五个方法.png
业务测试
输入:

输出:

- UDAF代码开发
 
import java.util.HashMap;
import java.util.Map;
import java.util.Set;
import org.apache.hadoop.hive.ql.exec.UDAF;
import org.apache.hadoop.hive.ql.exec.UDAFEvaluator;
import org.apache.log4j.Logger;
/**
* 实现多条数据合并成一条数据
*/
// 主类继承UDAF
public class StudentScoreAggUDAF extends UDAF {
    // 日志对象初始化
    public static Logger logger = Logger.getLogger(StudentScoreAggUDAF.class);
    // 静态类实现UDAFEvaluator
    public static class Evaluator implements UDAFEvaluator {
        // 设置成员变量,存储每个统计范围内的总记录数
        private Map<String, String> courseScoreMap;
        //初始化函数,map和reduce均会执行该函数,起到初始化所需要的变量的作用
        public Evaluator() {
            init();
        }
        // 初始化函数间传递的中间变量
        public void init() {
            courseScoreMap = new HashMap<String, String>();
        }
         //map阶段,返回值为boolean类型,当为true则程序继续执行,当为false则程序退出
        public boolean iterate(String course, String score) {
            if (course == null || score == null) {
                return true;
            }
            courseScoreMap.put(course, score);
            return true;
        }
         /**
         * 类似于combiner,在map范围内做部分聚合,将结果传给merge函数中的形参mapOutput
         * 如果需要聚合,则对iterator返回的结果处理,否则直接返回iterator的结果即可
         */
        public Map<String, String> terminatePartial() {
            return courseScoreMap;
        }
         // reduce 阶段,用于逐个迭代处理map当中每个不同key对应的 terminatePartial的结果
        public boolean merge(Map<String, String> mapOutput) {
            this.courseScoreMap.putAll(mapOutput);
            return true;
        }
        // 处理merge计算完成后的结果,即对merge完成后的结果做最后的业务处理
        public String terminate() {
            return courseScoreMap.toString();
        }
    }
}
测试sql语句
select id,username,score_agg(course,score) from student_score group by id,username;
- 自定义udaf实现max:https://www.cnblogs.com/itxuexiwang/p/6263110.html
 
UDTF
- User-Defined Table-Generating Functions
 - 要解决一行输入多行输出的问题,问题的应用场景不少
 - 用udtf解决一行输入多行输出的不多,往往被lateral view explode+udf等替代实现,比直接用udtf会更简单、直接一些
 
简述UDF/UDAF/UDTF是什么,各自解决问题及应用场景的更多相关文章
- [转]HIVE UDF/UDAF/UDTF的Map Reduce代码框架模板
		
FROM : http://hugh-wangp.iteye.com/blog/1472371 自己写代码时候的利用到的模板 UDF步骤: 1.必须继承org.apache.hadoop.hive ...
 - hive中 udf,udaf,udtf
		
1.hive中基本操作: DDL,DML 2.hive中函数 User-Defined Functions : UDF(用户自定义函数,简称JDF函数)UDF: 一进一出 upper lower ...
 - Hive 自定义函数 UDF UDAF UDTF
		
1.UDF:用户定义(普通)函数,只对单行数值产生作用: 继承UDF类,添加方法 evaluate() /** * @function 自定义UDF统计最小值 * @author John * */ ...
 - 【转】HIVE UDF UDAF UDTF 区别 使用
		
原博文出自于:http://blog.csdn.net/longzilong216/article/details/23921235(暂时) 感谢! 自己写代码时候的利用到的模板 UDF步骤: 1 ...
 - UDF/UDAF开发总结
		
参考文章: https://www.cnblogs.com/itxuexiwang/p/6264547.html https://www.cnblogs.com/eRrsr/p/6096989.htm ...
 - Hive自定义函数UDF和UDTF
		
UDF(user defined functions) 用于处理单行数据,并生成单个数据行. PS: l 一个普通UDF必须继承自“org.apache.hadoop.hive.ql.exec.UDF ...
 - 45、sparkSQL UDF&UDAF
		
一.UDF 1.UDF UDF:User Defined Function.用户自定义函数. 2.scala案例 package cn.spark.study.sql import org.apach ...
 - Spark 自定义函数(udf,udaf)
		
Spark 版本 2.3 文中测试数据(json) {"name":"lillcol", "age":24,"ip":& ...
 - Spark(十三)【SparkSQL自定义UDF/UDAF函数】
		
目录 一.UDF(一进一出) 二.UDAF(多近一出) spark2.X 实现方式 案例 ①继承UserDefinedAggregateFunction,实现其中的方法 ②创建函数对象,注册函数,在s ...
 
随机推荐
- ckeditor 捕获键代码
			
<!--<script type="text/javascript"> var ctrlKey = false; var shiftKey = false; if ...
 - C++银行储蓄程序代码
			
*/ * Copyright (c) 2016,烟台大学计算机与控制工程学院 * All rights reserved. * 文件名:text.cpp * 作者:常轩 * 微信公众号:Worldhe ...
 - 虚拟机+server03系统+sql的安装
			
教程: 首先安装虚拟机 然后安装server系统 最后完成sql的安装 https://download.pchome.net/system/sysenhance/detail-4673.html 虚 ...
 - http面试问题集锦
			
1.http的请求报文和响应报文? http请求报文:请求行(请求方法+url).请求头,请求体 http响应报文:状态行(http版本+状态码).响应头.响应体 2.常用的http请求类型? 请 ...
 - Fetch API与POST请求那些事
			
简述 相信不少前端开发童鞋与后端联调接口时,都会碰到前端明明已经传了参数,后端童鞋却说没有收到,尤其是post请求,遇到的非常多.本文以node.js作为服务端语言,借用express框架,简要分析客 ...
 - 从HTML标签开始
			
开始这一切吧! 没错,你没看错,我将从HTML标签开始我的整个系列文章.很基础吧?但是每个前端人都是从最简单的HTML标签开始的,都是从一个<html></html>开始整个前 ...
 - 微信h5页面调用第三方位置导航
			
微信h5页面拉起第三方导航应用 需要准备的: 通过微信认证的公众号有备案过的域名 背景:微信公众号点击菜单栏跳到h5页面,需要用到导航功能 需求:当用户点击导航按钮时,跳转到第三方app进行导航 参考 ...
 - 前端性能优化之Lazyload
			
前端性能优化之Lazyload @(Mob前端-冬晨)[JavaScript|技术分享|懒加载] [TOC] Lazyload 简介 前端工作中,界面和效果正在变得越来越狂拽炫酷,与此同时性能也是不得 ...
 - notepad++ 字符处理: 字符前后删除 或 删除未包含字符串的行
			
字符串前后删除 删除str之后的所有字符用,打开替换(Ctrl+H) :str.*$ 删除str之前的所有字符用:^.*str 如果是其他字符就把str替换为其他字符 ---------------- ...
 - py2.7 批量转换文件为 utf8 编码
			
source insight 不支持 utf8 ,但是在 linux 上查看的时候是 utf8 编码,就会显示不正常,所以写了个 python 小脚本,可以批量转换 py2.7 #coding:utf ...
 
			
		