Hive udf、UDF、GenericUDF

Hive开发UDF Hive开发UDF 从无到有开发hive的udf,本篇不针对简单的,针对复杂参数 目录: add jar /opt/workspace/udf/GetAppUDF.jar; 小坑,路径一定要写对,之前出现文件找不到,我以为要放到hdfs上面呢。 阅读详情

关键字:Hive udf、UDF、GenericUDF

Hive中,除了提供丰富的内置函数(见[一起学Hive]之二–Hive函数大全-完整版)之外,还允许用户使用Java开发自定义的UDF函数。

开发自定义UDF函数有两种方式,一个是继承org.apache.hadoop.hive.ql.exec.UDF,另一个是继承org.apache.hadoop.hive.ql.udf.generic.GenericUDF;

如果是针对简单的数据类型(比如String、Integer等)可以使用UDF,如果是针对复杂的数据类型(比如Array、Map、Struct等),可以使用GenericUDF,另外,GenericUDF还可以在函数开始之前和结束之后做一些初始化和关闭的处理操作。

UDF

使用UDF非常简单,只需要继承org.apache.hadoop.hive.ql.exec.UDF,并定义

public Object evaluate(Object args) {} 方法即可。

比如,下面的UDF函数实现了对一个String类型的字符串取HashMD5:


  1. package com.lxw1234.hive.udf;
  2.  
  3. import org.apache.hadoop.hbase.util.Bytes;
  4. import org.apache.hadoop.hbase.util.MD5Hash;
  5. import org.apache.hadoop.hive.ql.exec.UDF;
  6.  
  7. public class HashMd5 extends UDF {
  8. public String evaluate(String cookie) {
  9. return MD5Hash.getMD5AsHex(Bytes.toBytes(cookie));
  10. }
  11. }
  12.  

将上面的HashMd5类打成jar包,udf.jar

使用时候,在Hive命令行执行:


  1. add jar file:///tmp/udf.jar;
  2. CREATE temporary function str_md5 as 'com.lxw1234.hive.udf.HashMd5';
  3. select str_md5(‘lxw1234.com’) from dual;

GenericUDF

继承org.apache.hadoop.hive.ql.udf.generic.GenericUDF之后,需要重写几个重要的方法:

public void configure(MapredContext context) {}

//可选,该方法中可以通过context.getJobConf()获取job执行时候的Configuration;

//可以通过Configuration传递参数值

public ObjectInspector initialize(ObjectInspector[] arguments)

//必选,该方法用于函数初始化操作,并定义函数的返回值类型;

//比如,在该方法中可以初始化对象实例,初始化数据库链接,初始化读取文件等;

public Object evaluate(DeferredObject[] args){}

//必选,函数处理的核心方法,用途和UDF中的evaluate一样;

public String getDisplayString(String[] children)

//必选,显示函数的帮助信息

public void close(){}

//可选,map完成后,执行关闭操作

 

下面的程序将一个以逗号分隔的字符串,切分成List,并返回:


  1. package com.lxw1234.hive.udf;
  2.  
  3. import java.util.ArrayList;
  4. import java.util.Date;
  5.  
  6. import org.apache.hadoop.hive.ql.exec.MapredContext;
  7. import org.apache.hadoop.hive.ql.exec.UDFArgumentException;
  8. import org.apache.hadoop.hive.ql.metadata.HiveException;
  9. import org.apache.hadoop.hive.ql.udf.generic.GenericUDF;
  10. import org.apache.hadoop.hive.serde2.objectinspector.ObjectInspector;
  11. import org.apache.hadoop.hive.serde2.objectinspector.ObjectInspectorFactory;
  12. import org.apache.hadoop.hive.serde2.objectinspector.PrimitiveObjectInspector;
  13. import org.apache.hadoop.hive.serde2.objectinspector.primitive.PrimitiveObjectInspectorFactory;
  14.  
  15. /**
  16. * http://lxw1234.com
  17. * lxw的大数据田地
  18. * @author lxw1234
  19. * 该函数用于将字符串切分成List,并返回
  20. */
  21. public class Lxw1234GenericUDF extends GenericUDF {
  22. private static int mapTasks = 0;
  23. private static String init = "";
  24. private transient ArrayList ret = new ArrayList();
  25. @Override
  26. public void configure(MapredContext context) {
  27. System.out.println(new Date() + "######## configure");
  28. if(null != context) {
  29. //从jobConf中获取map数
  30. mapTasks = context.getJobConf().getNumMapTasks();
  31. }
  32. System.out.println(new Date() + "######## mapTasks [" + mapTasks + "] ..");
  33. }
  34. @Override
  35. public ObjectInspector initialize(ObjectInspector[] arguments)
  36. throws UDFArgumentException {
  37. System.out.println(new Date() + "######## initialize");
  38. //初始化文件系统,可以在这里初始化读取文件等
  39. init = "init";
  40. //定义函数的返回类型为java的List
  41. ObjectInspector returnOI = PrimitiveObjectInspectorFactory
  42. .getPrimitiveJavaObjectInspector(PrimitiveObjectInspector.PrimitiveCategory.STRING);
  43. return ObjectInspectorFactory.getStandardListObjectInspector(returnOI);
  44. }
  45.  
  46. @Override
  47. public Object evaluate(DeferredObject[] args) throws HiveException {
  48. ret.clear();
  49. if(args.length < 1) return ret;
  50. //获取第一个参数
  51. String str = args[0].get().toString();
  52. String[] s = str.split(",",-1);
  53. for(String word : s) {
  54. ret.add(word);
  55. }
  56. return ret;
  57. }
  58.  
  59. @Override
  60. public String getDisplayString(String[] children) {
  61. return "Usage: Lxw1234GenericUDF(String str)";
  62. }
  63.  
  64. }
  65.  

其中,在configure方法中,获取了本次任务的Map Task数目;

在initialize方法中,初始化了一个变量init,并定义了返回类型为java的List类型;

getDisplayString方法中显示函数的用法;

evaluate是核心的逻辑处理;

 

需要特别注意的是,configure方法,“This is only called in runtime of MapRedTask”,该方法只有在运行map task时候才被执行。它和initialize用法不一样,如果在initialize时候去使用MapredContext,则会报Null,因为此时MapredContext还是Null。

 

上面的函数执行后,在MapReduce的日志中打印出了以下内容:

hive udf

即在MapReduce阶段,GenericUDF几个方法的执行顺序为:

configure–>initialize–>evaluate–>close

 

Hive相关文章(持续更新):

一起学Hive系列

—-Hive概述,Hive是什么

—-Hive函数大全-完整版

—-Hive中的数据库(Database)和表(Table)

—-Hive的安装配置

—-Hive的视图和分区

—-Hive的动态分区

—-向Hive表中加载数据

—-使用Hive命令行

—-Hive的查询语句SELECT

—-Hive中Join的原理和机制

—-Hive中Join的类型和用法

—-Hive SQL的优化

—-Hive整合HBase,操作HBase表

—-Hive的元数据表结构详解

—-分析Hive表和分区的统计信息(Statistics)

—-Hive的WEB页面接口-HWI

—-从Hive表中进行数据抽样-Sampling

Hive分析函数系列

Hive索引

hive优化之——控制hive任务中的map数和reduce数

 

如果觉得本博客对您有帮助,请 赞助作者 。

转载请注明:lxw的大数据田地 » [一起学Hive]之十八-Hive UDF开发

喜欢 (2) 赏 分享 (0)
Hive的UDF编程之GenericUDF编程 Hive编程指南的GenericUDF,GenericUD可以接受负责数据类型的数据参数输入,这里我们使用的是输入数组,判断数组中是否包含某个值 阅读详情

相关推荐

将Hive统计分析结果导入到MySQL数据库表中(三)——使用Hive UDF或GenericUDF

前面我分别介绍了两种Hive将分析结果导入到MySQL表的两种方式:Sqoop导入方式和使用Hive、MySQL JDBC驱动,现在我介绍第三种,也是使用比较多的方式——使用Hive 自定义函数(UDF或GenericUDF)将每条记录插入到数据库表中。 一、使用UDF方式         使用UDF方式实现比较简单,只要继承UDF类,并重写evaluate方法即可        1、编

NIITYZU的专栏 2706

[一起学Hive]之十八-Hive UDF开发

Hive中,除了提供丰富的内置函数(见[一起学Hive]之二–Hive函数大全-完整版)之外,还允许用户使用Java开发自定义的UDF函数。 开发自定义UDF函数有两种方式,一个是继承org.apache.hadoop.hive.ql.exec.UDF,另一个是继承org.apache.hadoop.hive.ql.udf.generic.GenericUDF; 如果是针对简单的数据类

tony的专栏 934

Hive深入浅出UDF

Hive是一种构建在Hadoop上的数据仓库,Hive把SQL查询转换为一系列在Hadoop集群中运行的MapReduce作业,是MapReduce更高层次的抽象,不用编写具体的MapReduce方法,带来了很多便利,但是有时候hive提供的函数功能满足不了业务需要,就需要我们自己来写UDF函数来辅助完成。UDF函数其实就是一个简单的函数,执行过程就是在Hive转换成Mapreduce程序后,执行java方法,类似于像Mapreduce执行过程中加入一个插件,方便扩展。UDF只能实现一进一出的操作,如果需.

进击的数据小白 1704

Hive自定义UDF,继承GenericUDF类,如何处理传入的参数类型是否合理

Hive自定义UDF,继承GenericUDF类 内容目录Hive自定义UDF,继承GenericUDF类一、自定义UDF的步骤:二、实现UDF三、总代码四、测试四、总结 实现两个int类型计算,返回百分比 itp(1,2) – > return 50% 一、自定义UDF的步骤: 自定义类继承GenericUDF public class IntToPrecent extends GenericUDF{} 实现三个方法:initialize() evaluate() getDisp

weixin_46429290的博客 3742

Hive-UDF&GenericUDF&Hive-UDTF&Hive-UDAF

hive udf简介 在Hive中,用户可以自定义一些函数,用于扩展HiveQL的功能,而这类函数叫做UDF(用户自定义函数)。UDF分为两大类:UDAF(用户自定义聚合函数)和UDTF(用户自定义表生成函数)。在介绍UDAF和UDTF实现之前,我们先在本章介绍简单点的UDF实现——UDF和GenericUDF,然后以此为基础在下一章介绍UDAF和UDTF的实现。 Hive有两个不同的接口编写...

Ynzo的博客 1801

UDF开发手册 - UDF

一行输入,返回一个结果 可以满足日常工作中的大部分需求 UDF的实现方法 Hive 提供了两个实现 UDF 的方式: 第一种:继承 UDF 类 优点: 实现简单 支持Hive的基本类型、数组和Map 支持函数重载 缺点: 逻辑较为简单,只适合用于实现简单的函数 这种方式编码少,代码逻辑清晰,可以快速实现简单的UDF 第二种:继承 GenericUDF 类 优点: 支持任意长度、任意类型的参数 可以根据参数个数和类型实现不同的逻辑 可以实现初始化和关闭资源的逻辑(initialize、cl

qq_38783098的博客 1604

19,hive 高级 : UDF,GenericUDF,UDAF,UDTF

一 ,UDF :最古老的 UDF ,不建议使用 1 ,UDF : 用户自定义函数 2 ,显示所有函数 : show functions; 3 ,查看函数使用方法 desc function <=>; 4 ,pom.xml <?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache...

孙砚秋的博客 2152

数仓工具—Hive实战之UDF分词(1)

Hive UDF 实现分词,使用了两种当前最流行的分词器实现分词,并且使用了自定义的停用词库,实现方式是读取外部的词库文件

6万+

Hive UDF/GenericUDF开发

关键字:Hive udf、UDF、GenericUDF Hive中,除了提供丰富的内置函数(见[一起学Hive]之二–Hive函数大全-完整版)之外,还允许用户使用Java开发自定义的UDF函数。 开发自定义UDF函数有两种方式,一个是继承org.apache.hadoop.hive.ql.exec.UDF,另一个是继承org.apache.hadoop.hive.ql.udf.generic...

yancychas的博客 2502

数仓工具—Hive实战之GenericUDF使用详解(24)

GenericUDF 使用起来相比UDF 更复杂,但是我们也介绍了它支持复杂数据结构,性能更高,需要注意的是GenericUDF是抽象类不是接口,关于GenericUDF的使用的复杂案例可以参考我们的UDAF批量调用外部请求。

4万+

Vision-Language Navigation - Windows环境下编译安装Matterport3D Simulator仿真器(三)

目录1 编译 Matterport3D Simulator 源码1.1 源码下载1.2 编译 1 编译 Matterport3D Simulator 源码   在 Windows 下编译 Matterport3D Simulator 稍微有些不方便,需要对 CMakeLists.txt 进行一些修改,如果有更好的方法欢迎大家评论。 1.1 源码下载   还是直接在 Github 上搜索 Matterport3D Simulator 的 repo,下载源码。如果用 zip 方式,那么直接在下即可。如果使用

weixin_44110393的博客 4845

hive-自定义UDF函数- extends GenericUDF

在项目中遇到某些场景需要自定义函数,如日期处理: 那么如何在hive中要自定udf函数呢? 只要定义一个类Myudf 继承org.apache.hadoop.hive.ql.udf.generic.GenericUDF,然后打成Jar包, 发送到hive所在机器或hdfs, 登录hive, 使用命令创建函数: create function myfun1 as &amp;amp;amp;amp;amp;amp;amp;amp;amp;quot;包名.Myudf&amp;amp;amp;a

eyeofeagle的博客 9129

【01】Canoe零基础手把手教学 --- Canoe安装

Canoe零基础手把手教学

jaytinlove的博客 7781

使用Java继承UDF类或GenericUDF类给Hive3.1.2编写UDF实现编码解码加密解密并运行在USDP大数据集群

使用Java继承UDF类或GenericUDF类给Hive3.1.2编写UDF实现编码解码加密解密并运行在USDP大数据集群

虎鲸不是鱼 2969

pyinstaller+scrapy打包出现错误:OSError: could not get source code

错误如下: Traceback (most recent call last): File "scrapy\utils\defer.py", line 55, in mustbe_deferred File "scrapy\core\spidermw.py", line 60, in process_spider_input File "scrapy\core\scraper.py", line 152, in call_spider File "scrapy\utils\misc.py

kin的博客 1760

QT5.14.2+VS2019安装配置教程Windows

QT5.14.2+VS2019安装使用教程Windows前言一. QT的下载与安装1. QT的下载2. QT的安装二. 配置Visual Studio编译器环境1. 扩展工具下载2. 扩展工具配置 前言 由于Visual Studio 的功能强大,很多开发人员比较熟悉使用,所以可以通过将QT配置到Visual Studio中进行开发。 一. QT的下载与安装 1. QT的下载 QT5.14.2下载地址 2. QT的安装 断开网络!断开网络!!断开网络!!! 安装QT之前,需要断开电脑的网络连接,这样就

Zander0的博客 7249

hive使用mysql数据库,将Hive统计分析结果导入到MySQL数据库表中(3)——使用Hive UDF或GenericUDF...

将Hive统计分析结果导入到MySQL数据库表中(三)——使用Hive UDF或GenericUDF前面我分别介绍了两种Hive将分析结果导入到MySQL表的两种方式:Sqoop导入方式和使用Hive、MySQLJDBC驱动,现在我介绍第三种,也是使用比较多的方式——使用Hive 自定义函数(UDF或GenericUDF)将每条记录插入到数据库表中。一、使用UDF方式使用UDF方式实现比较简单,只...

weixin_39519072的博客 617

告别手动复制粘贴:3种高效合并Excel表格的方法对比(含代码)

本文对比了VBA、Power Query和Python三种高效合并Excel表格的方法,并提供了可直接运行的代码。针对不同数据量、更新频率和技术背景,详细分析了各方案的优缺点与适用场景,帮助读者告别低效的手动操作,实现自动化数据整合。

weixin_29057237的博客 444

挖挖Hive的代码(一)——UDF

系列第一篇,先扯扯。Hive的东西太多了,想一篇文章介绍完也是可以的,但是没有意义。所以我会分几篇写下我的“挖掘”经历,当然了,我也没打算把Hive所有的内容都挖一遍,只是记录下我感兴趣的、没见别人挖过的……          Hive对查询语句的解析过程,在淘宝数据平台的官方

Duke的专栏 5088

Python+AI能源管理实战:从电力负荷预测到智能调度的全流程开发

本系统展示了Python在能源管理领域的强大能力,通过AI技术实现了从预测到优化的智能决策闭环。随着碳中和目标的推进,智能能源系统将成为新型电力系统的核心大脑。📌 专业建议:系统部署需考虑网络安全防护,关键控制指令应设置多重验证机制!关注我的优快云账号获取能源系统安全最佳实践~下期预告:我们将探索Python在智慧医疗中的应用,开发基于多模态数据的智能诊断辅助系统。想提前获取代码?评论区留言"智慧医疗"获取GitHub源码链接!

资深全栈架构师,乐于在 优快云 分享技术见解,与大家携手共进,共攀技术巅峰! 625

62. 如何通过增强(Enhancement) 的方式给 SAP ABAP 标准程序增添新功能

本文通过一个实际的例子,介绍了如何不通过修改 SAP 标准 ABAP 程序源代码的方式,对其的功能进行增强,即采取 ABAP 增强开发的方式进行二次开发,这是一种在实际 SAP 项目实施过程中使用非常广泛的技术。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 3313

hive中udf编写

Hive中编写udf(User-defined function)需要继承UDF类或者GenericUDF类,至于UDF和GenericUDF类的区别,我们可以从GenericUDF类注释上找到答案 /** * A Generic User-defined function (GenericUDF) for the use with Hive. * * New Gener...

u012485099的博客 4904

YOLOv11来了,使用YOLOv11训练自己的数据集和推理(附YOLOv11网络结构图)

YOLOv11 由 Ultralytics 在 2024 年 9 月 30 日发布, 最新的 YOLOv11 模型在之前的 YOLO 版本引入了新功能和改进,以进一步提高性能和灵活性。YOLO11 在快速、准确且易于使用,使其成为各种对象检测和跟踪、实例分割、图像分类和姿态估计任务的绝佳选择。

在职AI算法工程师,擅长计算机视觉,YOLO目标检测、分割等,擅长web、pyqt界面可视化,好内容持续更新中,来这里跟大家一起学习,共同进步 28万+

Hive自定义UDF函数

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

atwdy的博客 2752

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

Hive- UDF&GenericUDF

hive udf简介 在Hive中,用户可以自定义一些函数,用于扩展HiveQL的功能,而这类函数叫做UDF(用户自定义函数)。UDF分为两大类:UDAF(用户自定义聚合函数)和UDTF(用户自定义表生成函数)。在介绍UDAF和UDTF实现之前,我们先在本章介绍简单点的UDF实现——UDF和GenericUDF,然后以此为基础在下一章介绍UDAF和UDTF的实现。 Hive有两个不同的接口编写UDF程序。一个是基础的UDF接口,一个是复杂的GenericUDF接口。 org.apache.hado..

u011250186的博客 2127

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

上一篇: HIVE 自定义函数之UDF/UDAF/UDTF
下一篇: UDF案例:
王树民
博客等级 码龄10年 912粉丝 560原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值