Hive——编写自定义UDF函数和UDTF函数

Hive自定义函数-UDF 当Hive内置的函数无法满足需要时,可以自定义函数。Hive允许我们在查询中轻易地使用自定义的函数。UDF必须使用Java语言,如果想要其他语言来实现,可以考虑SELECT TRANSFORM查询,它允许Hive与自定义的脚本通过Steam进行交互,类似MapReduce Streaming和Pig Stream。Hive中有3中类型的自定义函数:通常的UDF、UDAF(user-defined a 阅读详情

一.用户自定义函数UDF

用户自定义函数(UDF)是一个允许用户扩展HiveQL的强大的功能。用户可以使用Java编写自己的UDF,一旦将用户自定义函数加入到用户会话中(交互式的或者通过脚本执行的),它们就将和内置的函数一样使用,甚至可以提供联机帮助。Hive具有多种类型的用户自定义函数,每一种都会针对输入数据执行特定“一类”的转换过程

UDF函数特点:一行进一行出。简称,一进一出。

UDF函数解析公共字段:

编写UDF类

在pom.xml文件中添加如下内容

<dependency>
        <groupId>org.apache.hive</groupId>
        <artifactId>hive-exec</artifactId>
        <version>${hive.version}</version>
    </dependency>
<dependency>
            <groupId>org.apache.hadoop</groupId>
            <artifactId>hadoop-common</artifactId>
            <version>${hadoop.version}</version>
        </dependency>

 代码

编写一个UDF,需要继承UDF并实现evaluate()函数。在查询过程中,查询中对应的每个应用到这个函数的地方都会对这个类进行实例化。对于每行输入都会调用evaluate()函数。而evaluate()处理后的值会返回给Hive。同时用户是可以重载evaluate方法的。Hive会像Java的方法重载一样,自动选择匹配的方法

package UDF;

import org.apache.commons.lang.StringUtils;
import org.apache.hadoop.hive.ql.exec.UDF;
import org.json.JSONException;
import org.json.JSONObject;

public class BaseFieidUDF extends UDF {
    public static void main(String[] args) throws JSONException {
        String line = "1583776223469|{\"cm\":{\"ln\":\"-48.5\",\"sv\":\"V2.5.7\",\"os\":\"8.0.9\",\"g\":\"6F76AVD5@gmail.com\",\"mid\":\"0\",\"nw\":\"4G\",\"l\":\"pt\",\"vc\":\"3\",\"hw\":\"750*1134\",\"ar\":\"MX\",\"uid\":\"0\",\"t\":\"1583707297317\",\"la\":\"-52.9\",\"md\":\"sumsung-18\",\"vn\":\"1.2.4\",\"ba\":\"Sumsung\",\"sr\":\"V\"},\"ap\":\"app\",\"et\":[{\"ett\":\"1583705574227\",\"en\":\"display\",\"kv\":{\"goodsid\":\"0\",\"action\":\"1\",\"extend1\":\"1\",\"place\":\"0\",\"category\":\"63\"}},{\"ett\":\"1583760986259\",\"en\":\"loading\",\"kv\":{\"extend2\":\"\",\"loading_time\":\"4\",\"action\":\"3\",\"extend1\":\"\",\"type\":\"3\",\"type1\":\"\",\"loading_way\":\"1\"}},{\"ett\":\"1583746639124\",\"en\":\"ad\",\"kv\":{\"activityId\":\"1\",\"displayMills\":\"111839\",\"entry\":\"1\",\"action\":\"5\",\"contentType\":\"0\"}},{\"ett\":\"1583758016208\",\"en\":\"notification\",\"kv\":{\"ap_time\":\"1583694079866\",\"action\":\"1\",\"type\":\"3\",\"content\":\"\"}},{\"ett\":\"1583699890760\",\"en\":\"favorites\",\"kv\":{\"course_id\":4,\"id\":0,\"add_time\":\"1583730648134\",\"userid\":7}}]}";

        String mid = new BaseFieidUDF().evaluate(line, "st");

        System.out.println(mid);
    }

    private String evaluate(String line, String key) throws JSONException {

        String[] log = line.split("\\|");

        //对数据合法性验证,这一块比较复杂
        if (log.length != 2 || StringUtils.isBlank(log[1])){
            return "";
        }

        // 如果能走到下面,说明if没有走进去,数据合法,那么就说明切分之后长度为2 而且json数据不为空
        JSONObject baseJson = new JSONObject(log[1].trim());

        String result = "";

        //获取服务器时间 st : server_time  ,mid,l,os
        if ("st".equals(key)) {
            result = log[0].trim();
        }else if ("et".equals(key)){
            //获取事件数组
            if (baseJson.has("et")){
                result = baseJson.getString("et");
            }
        }else {
            // 获取cm:{具体的一个个kv}
            /*
                {"ln":"-106.3","sv":"V2.7.0","os":"8.1.2","g":"I26576E2@gmail.com","mid":"1","nw":"WIFI
                ","l":"es","vc":"8","hw":"1080*1920","ar":"MX","uid":"1","t":"1603997770291","la":"-39.8","md":"sumsung-16"
                ,"vn":"1.3.2","ba":"Sumsung","sr":"B"}
             */
            JSONObject cm = baseJson.getJSONObject("cm");

            //获取key对应公共字段的value,这个key就是公共字段的很多个不同的key值
            if (cm.has(key)){
                result = cm.getString(key);
            }
        }
        return result;
    }
}

二. 自定义UDTF函数

UDTF函数特点:多行进多行出。 简称,多进多出

  • 继承org.apache.hadoop.hive.ql.udf.generic.GenericUDTF,实现initialize, process, close三个方法。

  • UDTF首先会调用initialize方法,此方法返回UDTF的返回行的信息加粗样式(返回个数,类型)。

  • 初始化完成后,会调用process方法,真正的处理过程在process函数中,在process中,每一次forward()调用产生一行;如果产生多列可以将多个列的值放在一个数组中,然后将该数组传入到forward()函数。

  • 最后close()方法调用,对需要清理的方法进行清理。

UDTF函数解析具体事件

代码

package UDTF;

import org.apache.commons.lang.StringUtils;
import org.apache.hadoop.hive.ql.exec.UDFArgumentException;
import org.apache.hadoop.hive.ql.metadata.HiveException;
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 org.json.JSONArray;
import org.json.JSONException;

import java.util.ArrayList;

public class EventJsonUDTF extends GenericUDTF {
    //该方法中,我们指定输出参数的名称和参数类型
    public StructObjectInspector initialize(StructObjectInspector argOIs)throws UDFArgumentException {
        ArrayList<String> fieldNames = new ArrayList<String>();
        ArrayList<ObjectInspector> fieldOIs = new ArrayList<>();

        fieldNames.add("event_name");
        fieldOIs.add(PrimitiveObjectInspectorFactory.javaStringObjectInspector);
        fieldNames.add("event_json");
        fieldOIs.add(PrimitiveObjectInspectorFactory.javaStringObjectInspector);

        return ObjectInspectorFactory.getStandardStructObjectInspector(fieldNames,fieldOIs);

    }

    //输入一条记录,输出若干条结果,多条
    @Override
    public void process(Object[] objects) throws HiveException {
        //获取传入的et [{},{},{},{}]
        // objects[0].toString() ----> [{},{},{},{}]
        String input = objects[0].toString();

        //如果传进来的数据为空,直接返回过滤掉该数据
        if (StringUtils.isBlank(input)){
            return;
        }else {
            try {
                //获取一共有几个事件(ad/facoriters)
                JSONArray ja = new JSONArray(input);

                if (ja == null)
                    return;

                //循环遍历每一个事件
                for (int i = 0;i < ja.length();i++){
                    //遍历出来的没一条数据: {"ett":"1604021380867","en":"display","kv":{"goodsid":"0","action":"2","extend1":"2","place":"4","category":"53"}}
                    String[] result = new String[2];

                    try {
                        //取出每个事件的名称(ad/factoriters)
                        result[0] = ja.getJSONObject(i).getString("en");

                        //取出每一个事件整体
                        result[1] = ja.getString(i);
                    }catch (JSONException e){
                        continue;
                    }
                    //将结果返回
                    forward(result);
                }
            }catch (JSONException e){
                e.printStackTrace();
            }
        }
    }

    //当没有记录处理的时候该方法会被调用,用来清理代码或者产生额外的输出
    @Override
    public void close() throws HiveException {

    }

}

 

Hive内置函数和自定义函数(UDF、UDTF) 内置函数 在Hive中查看所有的内置函数和使用方法命令: SHOW FUNCTIONS; DESCRIBE FUNCTION <function_name>; DESCRIBE FUNCTION EXTENDED <function_name>; 内置函数详情可以查看官方文档: https://cwiki.apache.org/confluence/display/Hive/LanguageManual+UDF#LanguageManualUDF-Built-inOperators 阅读详情

相关推荐

[Hive基础]-- hive udf、udaf和udtf

Hive UDF、UDAF和UDTF函数 背景: Hive的自定义函数无法满足实际业务的需要,所以为了扩展性,Hive官方提供了自定义函数来实现需要的业务场景   1、定义     (1)udf(user defined function):  自定义函数,特点是输入一行,输出一行     (2)udaf(user defined aggregation function):自定义聚合函...

欢迎来到我的博客,一起探索代码里的世界! 2900

UDF与UDTF

继承UDF类重写initialize()和evaluate()两个方法initialize()方法中主要进行输入数据的合法性判断(如果不进行判断的话可以不重写)因为前面存在服务器时间,不是一个规范的json字符串所以需要进行UDF重写。

qq_45810187的博客 401

使用Hive自定义UDF和UDTF解析JSON数组

使用Hive自定义UDF和UDTF解析JSON数组在Hive中,我们经常需要处理包含JSON数组的数据。这些数组可以包含各种复杂的结构和数据类型。为了更好地处理这些数据,我们可以使用自定义UDF(User-Defined Function)和UDTF(User-Defined Table-Generating Function)来解析JSON数组。在本文中,我将详细介绍如何使用Hive编写自定义UDF和UDTF来解析JSON数组。

CyberFlare的博客 497

自定义UDF函数和UDTF函数

文章目录1.创建maven项目,引入依赖2.自定义函数自定义UDF函数自定义UDTF函数hive调用jar包创造函数方法1:上传到linux下导入hive方法2:上传到hdfs上再导入hive测试问题: 1.创建maven项目,引入依赖 pom.xml 在pom.xml文件中添加如下内容 <properties> <project.build.sourceEncoding>UTF8</project.build.sourceEncoding> <hi

JcJJJJCc的博客 619

大数据Hive(八):Hive自定义函数

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

Lansonli(蓝深李)的博客 2158

TMS320C6678开发笔记1-6---C6678单核烧写程序

第6节 单核烧写加载程序 6.1节 TI参考文档 参考文档:《KeystoneI Bootloader Resources and FAQ》讲的非常好,建议一定要看 https://processors.wiki.ti.com/index.php/KeystoneI_Bootloader_Resources_and_FAQ#Direct_Boot_Examples_.28without_IBL.29 里面有三个工程: C6678 EVM SPI boot example C6657 EVM ..

kunkliu的博客 5695

【Hive】Hive怎么写自定义函数(UDF、UDTF、UDAF)

Hive的自定义函数UDF UDAF UDTF

克里斯的博客 622

综合能源系统多时间尺度优化调度!诸多创新点让你抓住审稿人的心!

主要介绍综合能源系统的设备组成结构,并针对屋顶光伏系统、冷-热-电联供系统中的燃气轮机、燃气锅炉、光伏溴化锂制冷机、卡琳娜余热发电、中央空调系统,以及外网交互系统的配电网与天然气管网交互关系进行数学建模。1) 源-荷-储协同调度:研究屋顶光伏、燃气轮机、燃气锅炉等源侧设备,中央空调、电-热-冷负荷、可平移电负荷、可削减温控负荷等负荷侧资源,以及储能系统、电动汽车等储能侧设备的协同调度,以提高风光消纳能力,满足社会能源需求。通过电转热、电转冷、电转气等多能耦合方式,可进一步促进可再生能源的应用与发展。

weixin_48747334的博客 1488

Hive自定义UDF函数

UDF类实现简单,只需要实现evaluate()方法就可以了,并且该方法支持重载;GenericUDF类相对于UDF类复杂了一些,但提供了更加灵活的参数检查和更丰富的参数类型,开发中根据实际情况选择。上面的注册方式为临时注册,注册的函数只在当前session有效,一般只是测试使用。如果需要永久注册,可以先将jar包上传hdfs,然后通过命令永久注册。

atwdy的博客 2752

AR1020触摸控制器驱动开发:嵌入式I²C/SPI底层集成指南

电容式触摸控制器是现代嵌入式人机交互(HMI)系统的核心感知单元,其工作原理基于寄生电容变化检测与数字信号处理。Microchip AR1020 作为典型单芯片方案,内置硬件滤波、多点跟踪与手势识别引擎,通过I²C或SPI接口输出结构化事件数据,显著降低主控MCU负载。该类器件的技术价值在于平衡精度、功耗与实时性,广泛应用于工业HMI、医疗设备及车载终端等对可靠性要求严苛的场景。本文聚焦AR1020的寄存器映射、中断驱动模型、坐标解析机制及在STM32平台的HAL/LL级工程实现,涵盖硬件时序约束、固件配置

weixin_29323977的博客 600

Android Settings 设置Preference置灰显示

使Preference置灰显示,不能点击。先调用Preference的setEnabled(false),再调用setShouldDisableView(true); 如果使置灰项恢复正常可点击,可调用setEnabled(true)。

随风而动 1048

Hive自定义函数

十、Hive自定义函数 1.自定义函数步骤 2.自定义UDF函数 3.自定义UDTF函数

扛麻袋的少年的博客 5674

【异常】CNB提示The bill authorization scope cannot access the current request.

摘要:CNB API返回403错误,表明当前token的授权范围无法访问目标仓库。主要原因是:1) REPO_SLUG填写错误,导致资源地址不匹配;2) CNB_TOKEN未授权目标仓库;3) 账号账单状态异常。解决步骤:先检查REPO_SLUG是否与CNB平台仓库地址完全一致;再确认CNB_TOKEN是否绑定目标仓库且有读取权限;最后检查账号账单是否正常且覆盖目标资源。完成排查后更新配置即可解决此授权问题。

奶爸的编程之路,也就一周冷个三天 663

Hive 自定义UDF函数讲解

UDF函数需要继承org.apache.hadoop.hive.ql.exec.UDF类,并且添加evaluate方法,原因是:UDF类默认的UDFMethodResolver是org.apache.hadoop.hive.ql.exec.DefaultUDFMethodResolv​​​​​er,evaluate方法是在DefaultUDFMethodResolver中进行配置,默认绑定的是evaluate方法。1)UDF,自定义一个函数,并且实现把列中的数据由大写转换成小写。

wuhahaq的博客 697

2026 MCM Problem A:智能手机电池连续时间建模——完整解题思路附第一问解题代码

摘要:本文针对2026年MCM A题"智能手机电池连续时间建模"问题,提出基于能量守恒原理的微分方程模型。通过建立以SOC(t)为状态变量的动态系统,将屏幕亮度、处理器负载等主要耗电因素纳入统一功率框架,实现了不同使用场景下的电量变化精确描述。研究表明,屏幕亮度和CPU负载对续航时间影响最大,温度与后台任务会产生放大效应。该模型具有物理可解释性和应用扩展性,为手机电源管理提供了理论依据。(150字)

一键难忘的博客 770

SRS流媒体服务器在Windows下的安装

在之前的流媒体开发中(视频会议),我基本上使用nginx加模块的方式进行学习、测试,正式开发的时候改为服务器端用EasyDarwin,客户端用rtsp-simple-server(这些流媒体服务器的用法见我以前的博文),这样可以充分利用客户端的资源,降低服务器端的压力。在流媒体协议方案,我选择相对较快的rtsp。这个协议优点是支持UDP协议,优化好的环境下可以实现3秒以下的延迟,基本满足甲方要求,缺点就是不支持网页播放。

dgnankai的专栏 2023

hive编写自定函数udf、udtf

UDF(User-Defined-Function) 一进一出UDAF(User-Defined Aggregation Function) 聚合函数,多进一出,如:count/max/minUDTF(User-Defined Table-Generating Functions) 炸裂函数,一进多出,如:explode()

weixin_61352535的博客 423

帆软报表导出各种格式之后台导出

我们前面介绍了帆软报表在界面上的导出是通过类似的URL:http://localhost:8075/webroot/decision/view/report?op=export&sessionID=10653244-3e46-408c-bc54-f89a214a9bc7&format=image&extype=PNG 来完成的,就是带OP=export以及format参数来完成的。如果不从界面传参数,比如我们自己实现了一个HTTP接口,也可以通过传参数format来完成各种格式的导

帆软爱好者的专栏 4270

java udtf 递归_hive中UDF、UDAF和UDTF使用

Hive进行UDF开发十分简单,此处所说UDF为Temporary的function,所以需要hive版本在0.4.0以上才可以。一、背景:Hive是基于Hadoop中的MapReduce,提供HQL查询的数据仓库。Hive是一个很开放的系统,很多内容都支持用户定制,包括:a)文件格式:Text File,Sequence Fileb)内存中的数据格式: Java Integer/String, ...

weixin_26851099的博客 1269

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

Hive中自定义函数UDF、UDTF函数介绍

Hive中自定义函数UDF、UDTF函数介绍

qq_40078490的博客 1384

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

hive中添加UDF

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

hzp666的博客 3670

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

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) ...

小白学编程 4751

Hive 自定义函数:从 “搬砖工“ 到 “造轮子大佬“ 的逆袭之路

- 先把jar包放到Hive的lib目录下,比如/opt/hive/lib/-- 创建临时函数,注意temporary关键字//这里单引号里的路径应与Java类的路径一致-- 测试一下,输入"zhang"应该输出"Zhang"面试官:"你在项目中自定义过 Hive 函数吗?普通回答:"用过,写过一个首字母大写的 UDF。大佬回答:" 哦,你说 UDF 啊,我们项目里用得挺多的。比如有个需求是解析嵌套 JSON,内置函数搞不定,我就写了个 UDTF,用递归解析嵌套结构,然后通过。

HENANwuyanzu66的博客 2424

Hive学习之———自定义函数

正常在我们hive中是由很多的函数的,有的我们可以直接用,但是但我们去计算复杂数据时,我们就要去写一些规则来将数据筛选出来,这里我使用的是idea开发环境来开发的。 1.UDF 自定义函数分为三种 一、UDF一对一 UDF是继承hive中UDF而实现evaluate方法,它是一对一的关系,UDF操作作用于单个数据行,并且产生一个数据行作为输出。大多数函数都属于这一类(比如数学函数和字符串函数)。 ...

大数据让未来充满希望 371

Hive之自定义函数

Hive之自定义函数 系统内置函数 查看系统内置函数:hive> show functions; 显示自带函数的用法:hive> desc function extended upper; 附录:Hive运算符及函数介绍 自定义函数:用户自定义函数分为三类 1)UDF(User-Defined-Function):一进一出 2)UDAF(User-Defined A...

weixin_38255444的博客 226

Hive(12):Hive的函数之自定义函数

1)Hive 自带了一些函数,比如:max/min等,但是数量有限,自己可以通过自定义UDF来方便的扩展。2)当Hive提供的内置函数无法满足你的业务处理需要时,此时就可以考虑使用用户自定义函数(UDF:user-defined function)。UDF(User-Defined-Function) : 一进一出UDAF(User-Defined Aggregation Function):聚集函数,多进一出 类似于:count/max/min。

yang_shibiao的博客 798
上一篇: 数据仓库分层
下一篇: 累计型快照事实表——订单优惠表使用
Poolweet_
博客等级 码龄7年 21粉丝 48原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值