Hive 自定义函数 UDF UDTF UDAF

Hive系列 (四):自定义函数UDF UDTF UDAF 使用idea创建hive自定义函数UDF UDTF UDAF ,详细介绍及语法代码案例 阅读详情

Hive 自定义函数 UDF UDTF UDAF

  • UDF:用户定义(普通)函数,只对单行数值产生作用;

    UDF只能实现一进一出的操作。

    定义udf 计算两个数最小值
    
    public class Min extends UDF {
    
            public Double evaluate(Double a, Double b) {
    
                if (a == null)
                    a = 0.0;
                if (b == null)
                    b = 0.0;
                if (a >= b) {
                    return b;
                } else {
                    return a;
                }
            }
        }
        
     
    a)把程序打成jar包
    
    b)添加jar包:add jar /run/jar/udf_test.jar;
    
    c)创建临时函数:hive>CREATE TEMPORARY FUNCTION add_example AS 'hive.udf.Add';
    
    d)销毁临时函数:hive> DROP TEMPORARY FUNCTION add_example;
    
  • UDTF:User-Defined Table-Generating Functions,用户定义表生成函数

    用来解决输入一行输出多行

    继承org.apache.hadoop.hive.ql.udf.generic.GenericUDTF,
    实现initialize, process, close三个方法。
    
    UDTF首先会调用initialize方法,此方法返回UDTF的返回行的信息(返回个数,类型)。
    
    初始化完成后,会调用process方法,真正的处理过程在process函数中,在process中,每一次forward()调用产生一行;如果产生多列可以将多个列的值放在一个数组中,然后将该数组传入到forward()函数。
    
    最后close()方法调用,对需要清理的方法进行清理
    
    例子:切分”key:value;key:value”字符串,返回结果为key, value两个字段。
    import java.util.ArrayList;
    
     import org.apache.hadoop.hive.ql.udf.generic.GenericUDTF;
     import org.apache.hadoop.hive.ql.exec.UDFArgumentException;
     import org.apache.hadoop.hive.ql.exec.UDFArgumentLengthException;
     import org.apache.hadoop.hive.ql.metadata.HiveException;
     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;
    
     public class ExplodeMap extends GenericUDTF{
    
         @Override
         public void close() throws HiveException {
             // TODO Auto-generated method stub    
         }
    
         @Override
         public StructObjectInspector initialize(ObjectInspector[] args)
                 throws UDFArgumentException {
             if (args.length != 1) {
                 throw new UDFArgumentLengthException("ExplodeMap takes only one argument");
             }
             if (args[0].getCategory() != ObjectInspector.Category.PRIMITIVE) {
                 throw new UDFArgumentException("ExplodeMap takes string as a parameter");
             }
    
             ArrayList<String> fieldNames = new ArrayList<String>();
             ArrayList<ObjectInspector> fieldOIs = new ArrayList<ObjectInspector>();
             fieldNames.add("col1");
             fieldOIs.add(PrimitiveObjectInspectorFactory.javaStringObjectInspector);
             fieldNames.add("col2");
             fieldOIs.add(PrimitiveObjectInspectorFactory.javaStringObjectInspector);
    
             return ObjectInspectorFactory.getStandardStructObjectInspector(fieldNames,fieldOIs);
         }
    
         @Override
         public void process(Object[] args) throws HiveException {
             String input = args[0].toString();
             String[] test = input.split(";");
             for(int i=0; i<test.length; i++) {
                 try {
                     String[] result = test[i].split(":");
                     forward(result);
                 } catch (Exception e) {
                     continue;
                 }
             }
         }
     }
    
    a)把程序打成jar包
    
    b)添加jar包:add jar /run/jar/udf_test.jar;
    
    c)创建临时函数:CREATE TEMPORARY FUNCTION explode_map AS 'cn.itcast.hive.udtf.ExplodeMap';
    
    d)销毁临时函数:hive> DROP TEMPORARY FUNCTION add_example;
    

    udtf的使用:

    UDTF有两种使用方法,一种直接放到select后面,一种和lateral view一起使用。
    
    create table src(properties String);
    	
    	vi src.txt
    	key1:value1;key2:value2;
    	
    load data local inpath '/root/hivedata/src.txt' into table src;
    
    1:直接select中使用
    
    select explode_map(properties) as (col1,col2) from src;
    
    不可以添加其他字段使用
    select a, explode_map(properties) as (col1,col2) from src;
    
    不可以嵌套调用
    select explode_map(explode_map(properties)) from src;
    
    不可以和group by/cluster by/distribute by/sort by一起使用
    select explode_map(properties) as (col1,col2) from src group by col1, col2;
     
    
    
    2:和lateral view一起使用
    
    select src.id, mytable.col1, mytable.col2 from src lateral view explode_map(properties) mytable as col1, col2;
    
  • UDAF:User- Defined Aggregation Funcation;用户定义聚合函数,可对多行数据产生作用;

    等同与SQL中常用的SUM(),AVG(),也是聚合函数;

    UDAF实现多进一出

    UDAF实现有简单与通用两种方式:
    import org.apache.hadoop.hive.ql.exec.UDAF;
    import org.apache.hadoop.hive.ql.exec.UDAFEvaluator;
    import org.apache.hadoop.io.IntWritable;

//UDAF是输入多个数据行,产生一个数据行
//用户自定义的UDAF必须是继承了UDAF,且内部包含多个实现了exec的静态类
public class MaxiNumber extends UDAF {
public static class MaxiNumberIntUDAFEvaluator implements UDAFEvaluator {
// 最终结果
private IntWritable result;

    // 负责初始化计算函数并设置它的内部状态,result是存放最终结果的
    @Override
    public void init() {
        result = null;
    }

    // 每次对一个新值进行聚集计算都会调用iterate方法
    public boolean iterate(IntWritable value) {
        if (value == null)
            return false;
        if (result == null)
            result = new IntWritable(value.get());
        else
            result.set(Math.max(result.get(), value.get()));
        return true;
    }

    // Hive需要部分聚集结果的时候会调用该方法
    // 会返回一个封装了聚集计算当前状态的对象
    public IntWritable terminatePartial() {
        return result;
    }

    // 合并两个部分聚集值会调用这个方法
    public boolean merge(IntWritable other) {
        return iterate(other);
    }

    // Hive需要最终聚集结果时候会调用该方法
    public IntWritable terminate() {
        return result;
    }
}

}

Hive 自定义函数(UDF,UDAF,UDTF)详解 开窗函数查询 1.数据准备:name,orderdate,cost jack,2017-01-01,10 tony,2017-01-02,15 jack,2017-02-03,23 tony,2017-01-04,29 jack,2017-01-05,46 jack,2017-04-06,42 tony,2017-01-07,50 jack,2017-01-08,55 mart,2017-0... 阅读详情

相关推荐

HIVE 自定义函数之UDF/UDAF/UDTF

UDFUDF:用户自定义函数,表示以一行数据中的一列或者多列数据作为参数然后返回结果是一个值的函数,例如round()和floor(). 示例:比较两个逗号分隔的字符串是否相同。JAVA代码中一定要继承UDF类并实现evaluate()函数,在查询过程中对应的么一个用到这个函数的地方都会对这个类进行实例化,对每行输入都会调用到evaluate()函数,而且用户是可以重载evaluate方法的。

Hello_Word___的博客 2330

hive从入门到实战No.3

UDAF(user defined aggregation function) 自定义udaf函数self_count,实现系统udaf count的功能 in:out=n:1,即输入N条数据,返回一条处理结果,即列转行。 最常见的系统聚合函数,如count,sum,avg,max等 实现步骤 自定义一个java类 继承UDAF类 内部定义一个静态类,实现UDAFEvaluator接口 实现方法init,iterate,terminatePartial,merge,terminate共5个方法.

Nikolala123的博客 925

Steger算法(Line_Gauss)-光条中心线提取(基于Hessian矩阵)

Steger算法(Line_Gauss)-光条中心线提取(基于Hessian矩阵)算法背景介绍Hessian 矩阵与泰勒多项式关于求t导数与中心点、亚像素点高斯函数作用文献 算法背景介绍 在线结构光视觉传感器中,由线激光器发射出的线结构光,在本质上为一个连续且具有一定厚度的空间光平面,而在目标表面上所形成的具有一定宽度的光条特征,即为该光平面与目标表面相交而成的交线。在该空间光平面的厚度方向上,光强近似服从高斯分布,因而在摄像机采集到的光条图像中,在沿着光条宽度的方向或光条的法线方向上,其灰度也会呈现出类似

jiangxing11的博客 1万+

hive中创建udf函数常见问题及解决办法

执行sql中使用udf函数报数组下标越界异常: hue中报错为: Error while processing statement: FAILED: Execution Error, return code 2 from org.apache.hadoop.hive.ql.exec.mr.MapRedTask。 log日志报错为: Caused by: java.lang.Array...

hanxue6898的博客 7613

基于树莓派5的AR头显开发:从硬件选型到Unity整合全解析

增强现实(AR)技术通过将虚拟信息叠加到真实世界,为用户提供沉浸式交互体验。其核心原理依赖于计算机视觉进行环境感知与空间定位,并结合实时3D渲染实现虚实融合。在工程实践中,嵌入式平台因其低成本、低功耗特性,成为探索AR应用边界的重要载体。本项目以树莓派5为核心,通过集成OpenCV进行ArUco标记识别实现精准空间定位,并利用MediaPipe完成手势交互,最终在Unity引擎中完成虚实场景的实时渲染与融合,为开发者提供了一个完整的、可亲手实践的AR系统开发方案。

weixin_32430941的博客 254

【Diffusion分割】医学图像分割中去噪扩散技术

扩散模型(DPM)在图像生成方面表现出了卓越的性能,其性能往往优于其他生成模型。自其问世以来,强大的噪声-图像去噪管道已被扩展到各种判别任务中,包括图像分割。在医学成像中,图像往往是大型三维扫描图像,由于内存消耗大、迭代采样过程耗时,使用 DPM 对一幅图像进行分割的效率极低。在这项工作中,我们提出了一种(LDSeg),可在潜空间中执行扩散,用于医学影像分割。我们。潜空间条件扩散不仅能确保对多标签对象进行精确的 n-D 图像分割,还能缓解基于 DPM 的传统分割法的主要潜在问题:(。

qq_43583311的博客 1171

在工作中往hive插入数据过程中发现的一些坑

前言:近期在工作中往hive插入数据的过程中,发现了一些坑,它们也许是Hive提倡的比关系数据库更加自由的体现(同一时候引来一些问题)。也许是一些bug。总而言之,这些都须要使用Hive的IT人员需要额外注意,希望大家注意。 一、数据导入的六种方式 1、加载本地文件到hive表 2、加载hdfs文件到hive中 3、加载数据覆盖表中已有的数据 4、创建表时通过select加载 create table if not exists default.dept_cats as select * from

李文良的博客 17万+

半导体物理-Si晶体生长方向<2>

Si(硅)晶体的生长方向是一个重要的概念,尤其在半导体工业中。这个概念涉及到晶体在生长过程中原子排列的方向,对晶体的性质和应用有重大影响。让我为您详细解释:理解Si晶体的生长方向对于半导体材料的研究和应用非常重要,它直接影响了最终器件的性能和制造工艺。在实际应用中,选择适当的生长方向可以优化器件性能,提高产品质量。

m0_37606066的博客 2995

hive自定义UDF函数遇到的坑

遇到的问题: 1、add jar后找不到类:FAILED: Class com.udf.udf.TestUdf not found 2、建函数没有权限,报延签的错误:java.lang.SecurityException: Invalid signature file digest for Manifest main attributes 搭建流程: 1、新建一个java项目,新建l...

yhp353134的博客 6016

联想X3650M5服务器双模式切换实战:UEFI与Legacy BIOS如何选择?

本文深入探讨了联想X3650 M5服务器在UEFI与Legacy BIOS启动模式间的选择策略。文章从技术原理、决策矩阵、实战切换步骤及后期验证等方面,为企业IT管理员提供了基于操作系统兼容性、存储架构、安全合规与运维习惯的完整决策框架,帮助其在数据中心硬件生命周期管理中做出明智选择。

weixin_29207533的博客 281

如何通过CAD图中的坐标来确定是哪个坐标系

地理坐标系:为球面坐标。参考平面地是椭球面,坐标单位:经纬度。以地球参考为例,坐标系就相当于整个地球,而地理坐标系就是椭球状的完整的立体地球。所以我们可以看到生活中的数据与地图是一定含有地理坐标系的,因为他是客观上来说确确实实存在的。投影坐标系:为平面坐标。参考平面地是水平面,坐标单位:米、千米等。这就相当于把地球当成一个橘子,然后一刀切开,把橘子皮平面铺开,这个过程就是地理投影的过程。严谨一点来说就是建立一个参考系统,按照对应位置把椭球体投射到平面。那坐标系统主要有那些呢?北京54。

vjmap的博客 2万+

HIVE自定义UDAF函数

/ 确定各个阶段输入输出参数的数据格式ObjectInspectors public ObjectInspector init(Mode m , ObjectInspector [ ] parameters) throws HiveException;// 保存数据聚集结果的类 abstract AggregationBuffer getNewAggregationBuffer() throws HiveException;...

weixin_46429290的博客 2661

9、储备池学习:从学习到学习的新范式

本文探讨了基于学习到学习(L2L)框架的储备池计算新范式,提出通过在外循环中优化储备池的超参数(如递归连接权重、输入权重和读出初始化),以提升其在多种任务中的内循环学习性能。研究展示了两种主要实验设置:一是优化储备池用于回归二阶Volterra滤波器任务,显著优于随机基线;二是实现无需调整读出权重、仅依赖内部动态学习非线性函数的能力,表明储备池可快速构建目标函数的内部模型并安装任务先验知识。结合流程图与表格,文章系统呈现了L2L的训练流程、技术细节及实验结果,并讨论了性能提升、泛化能力等开放问题,指出了未来

ujm56789012的博客 504

Hive自定义函数案例(UDF、UDAF、UDTF)

Hive 自定义函数案例(UDF、UDAF、UDTF)。

大头皮鞋的博客 2827

openGauss学习笔记-280 openGauss性能调优-实际调优案例09-修改启动参数解决TPCC大幅度波动

openGauss学习笔记-280 openGauss性能调优-实际调优案例09-修改启动参数解决TPCC大幅度波动280.1 现象描述280.2 优化分析 openGauss学习笔记-280 ope

超哥的博客 308

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

hive中的自定义函数 udf 和udaf和udtf的区别 以及用法

hive中的自定义函数 udf 和udaf和udtf的区别 以及用法 udf: 特点:input:output=1:1 实例函数:md5,split,ltrim 应用场景:1:1的情况,比如md5… 实现方法:简单udf实现 extends UDF 方法名 evaluate 举例: public class Lower extends UDF { public Text evaluate(Te...

zengxianglei的博客--手指星辰 奈何天! 4044

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

Hive自定义UDF、UDAF、UDTF函数实例与区别

Hive中有三种自定义函数 分类 1、用户定义函数(user-defined function)UDF; 2、用户定义聚集函数(user-defined aggregate function,UDAF); 3、用户定义表生成函数(user-defined table-generating function,UDTF)。 介绍 UDF操作作用于单个数据行,并且产生一个数据行作为输出。大多数函数都属于...

qq_28203321的博客 1564

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

Hive中的用户自定义函数:UDF、UDAF、UDTF的区别

用户自定义函数(UDF)是Hive中最基本的自定义函数类型。它允许用户根据自己的需求,创建可以在HiveQL查询中使用的函数。UDF通常用于进行数据转换、格式化和计算等操作。用户自定义聚合函数(UDAF)允许用户定义聚合逻辑,这种逻辑通常需要在数据集中对多行数据进行处理并返回一个单一结果。UDAF在数据分析中非常常见,适合用于执行统计、汇总等操作。用户自定义表生成函数(UDTF)是一种特殊类型的自定义函数,它允许用户从输入行生成多行输出。UDTF非常适合用于处理复杂的数据结构,如拆分字符串、展开数组等。

My_wife_QBL的博客 1630

Hive之自定义函数(UDF、UDAF、UDTF)

内容仅截取函数部分,其他Hive学习笔记见个人博客 https://wangbowen.cn/2020/08/27/Hive%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/ 十三、函数 13.1 发现和描述函数 -- 可以看到hive当前会话的所有函数名称,包括内置和用户自定义的 show functions; -- 查看函数的简介(加上extended显示更详细的文档) describe function [extended] <函数名>; 13.2 调用函数 函

IT小王 1555

Hive中用户自定义函数UDF UDTF UDAF

概述 Hive 自带了一些函数,比如:max/min 等,但是数量有限,当 Hive 提供的内置函数无法满足你的业务处理需要时,此时就可以考虑使用用户自定义 函数(UDF:user-defined function)根据用户自定义函数类别分为以下三种: UDF(User-Defined-Function) 一进一出 UDAF(User-Defined Aggregation Function) 聚集函数,多进一出 类似于:count/max/min UDTF...

houkai的博客 1433

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

在Hive学习中,我们刚接触到用户自定义函数可能会有点不理解,下面我就根据我所知的来给跟我遇到过同样问题的人一点帮助。目录前言简单定义UDF具体实现预应用运用UDF,源自于英文user-defined function。我们根据函数输入输出的行数可以将其分为三类:(不仅适用于用户自定义函数)UDF普通函数,特点是一进一出。例如取整函数round,接收一行数据,输出一行数据。UDAF聚合函数,A即Aggregation聚合的意思,特点是多进一出。

hfzchj的博客 1684

hive自定义udf、udtf、udaf函数

继承org.apache.hadoop.hive.ql.udf.generic.GenericUDTF,实现initialize, process, close三个方法。org.apache.hadoop.hive.ql.exec.UDAFEvaluator(内部类Evaluator实现UDAFEvaluator接口)UDTF 操作作用于单个数据行,并且产生多个数据行-------一个表作为输出。key:value;org.apache.hadoop.hive.ql.exec.UDAF(函数类继承)

用一行行优雅代码重构现实的造梦者,坚信简洁即正义的美学践行者。 299

Hive函数之自定义函数UDF、UDTF、UDAF

Hive自定义函数 为啥会有自定义函数 因为hive自带函数不能满足开发的需求,所以需要我们自己写hive函数,来实现一些复杂的转换或者其自身不能完成的方法。 UDF(一对一) 将输入的一个值,根据一定的转换,生成另一个格式的值。在这里UDF函数需要继承UDF类,重写evaluate(),而里面的参数根据需求传入。 public class MyUDF extends UDF { publ...

Reflush的博客 532

【Hive】(十二)Hive自定义函数详解(UDF、UDAF、UDTF)

文章目录前言一、自定义函数二、UDF:用户定义(普通)函数,只对单行数值产生作用1.创建一个Maven工程Hive2.导入依赖3.创建一个类4.打成jar包上传到服务器/opt/soft/data/udf.jar5.将jar包添加到hive的classpath6.创建临时函数与开发好的java class关联7.即可在hql中使用自定义的函数三、UDAF:User- Defined Aggrega...

云祁QI 1676

hive-2 自定义函数UDF、UDAF、UDTF介绍及区别

Hive中有三种UDF:    1、用户定义函数(user-defined function)UDF;    2、用户定义聚集函数(user-defined aggregate function,UDAF);    3、用户定义表生成函数(user-defined table-generating function,UDTF)。===================================...

xiaofengguojiangnan的博客 2万+

Hive 自定义函数编写(UDF,UDAF,UDTF)

虽然hive中为我们提供了很多的内置函数,但是在实际工作中,有些情况下hive提供的内置函数无法满足我们的需求,就需要我们自己来手动编写,所以就有了自定义函数UDF。UDF分为三种,分别如下一进一出(输入一行,输出一行),输入一行数据,输出一行数据;比如upper()、lowser()等。,多进一出(输入多行,输出一行),输入多行数据,聚合成一行数据,比如avg()、sum()等。,一进多出(输入一行,输出多行),比如官方文档https。............

菜菜的大数据开发の路 1319
上一篇: mysql中的substr和js中的substr
下一篇: Hive中行列转换
古城的风cll
博客等级 码龄8年 68粉丝 205原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值