Hive中虽然自带了一些函数,例如max()、avg()、sum()等,但有时候这些函数可能无法满足我们的需要,这时候就可以通过自定义UDF来进行扩展。

开发流程

UDF的开发流程基本有以下步骤:

  1. 继承UDF类或者GenericUDF类;
  2. 重写evaluate()方法并实现函数逻辑;
  3. 打jar包;
  4. 上传到hdfs;
  5. 使用jar创建临时或者永久函数;
  6. 调用函数。

UDF实现

在重写之前,我们首先建立一个Maven工程。具体的方法大家可以参考我以前的一篇文章:
Hadoop的环境变量配置及与java的交互
创建完成后,需要下载两个包:

<dependency><groupId>org.apache.hadoop</groupId><artifactId>hadoop-common</artifactId><version>2.6.0</version></dependency><dependency><groupId>org.apache.hive</groupId><artifactId>hive-exec</artifactId><version>1.2.1</version></dependency>

注意版本要和自身的一致。
我们就来实现字母的全转大写这一方法:
1、建立一个Big类,继承UDF,编写evaluate方法:
如果文档值为空,则返回空值,如果有字母,则转为其大写输出,其他类型的数值则直接返回

public class Big extends UDF {public Text evaluate(Text str) {if (str == null) {return null;}return new Text(str.toString().toUpperCase());}
}

方法写好后打jar包先放到linux上去,再上传到hdfs。
我这里创建了一个文件路径:

hdfs dfs -mkdir -p /test/hive/functions

上传文件:

hdfs dfs -put UDFexercise.jar /test/hive/functions

临时函数
首先我们创建一个临时函数:
在Hive命令行使用 add jar jar包路径,把jar包加载到临时系统中

add jar /root/UDFexercise.jar;

然后实现这一函数:
create temporary function 函数名 as '方法的全路径’

create temporary function Big as 'Test.work.Big';

注意:此时如果报错可用以下方法解决。
下载zip包

yum install -y zip

删除META_INF包:
*zip -d jar包 ‘META-INF/.SF’ ‘META-INT/.RSA’ 'META-INF/SF’

 zip -d UDFexercise.jar 'META-INF/.SF' 'META-INT/.RSA' 'META-INF/*SF';

然后退出hive再重新进入,再次执行以下步骤:

add jar /root/UDFexercise.jar;
create temporary function Big as 'Test.work.Big';

即可成功

我们可以直接通过select来实现这一方法:

select Big('abc');


永久函数
前面的步骤不变,当上传到hdfs后,我们选择需要用到的数据库。

use test;

创建永久函数的指令:
create function 函数名 as ‘方法的全路径’
using jar ‘hdfs:/主机名:9000/jar包的hdfs路径’;

create function Big as 'Test.work.Big' using jar 'hdfs://hadoop01:9000/test/hive/functions/UDFexercise.jar';


创建成功后,我们就可以永久调用此函数:

select Big('abc');


我们再举个例子。在一个时间的基础上,加上小时后得出新的时间。

public class Hour extends UDF {public Text evaluate(Text times, IntWritable hours) throws ParseException {//把接收到的数据转换成java类型String str = times.toString();int i = hours.get();//日期格式SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");//把字符串转换成Date类型Date d = sdf.parse(str);//计算时间,小时i*60分钟*60秒*1000毫秒得到新的时间,再把新的时间转成固定格式String rst = sdf.format(new Date(d.getTime() + i * 60 * 60 * 1000));return new Text(rst);}
}

打成jar包上传后,根据上述方法建立临时/永久函数:

add jar /test/UDFexercise.jar;
create temporary function time as 'Test.work.Hour';
select time('2020-09-22 12:00:00',200);

临时UDF和永久UDF的区别

1、当我们创建一个临时UDF后,如果退出系统,那么这个函数也将消失,如果想要调用,需要登录上重新创建;而永久性的UDF函数则会一直存在;
2、临时UDF可以在任意库中直接调用,不受库限制;而永久性UDF函数在如果想要再其他库调用需要在函数名前加上库名。
例如,我在test库创建了一个永久性的Big函数,那么在其他库调用的时候需要这样写

 select test.Big('abc');

才能执行成功。

Hive UDF自定义函数(临时和永久的区别)相关推荐

  1. hive 转拼音udf_<Zhuuu_ZZ>HIVE(十二)UDF自定义函数

    <Zhuuu_ZZ>HIVE(十二)UDF自定义函数 <Zhuuu_ZZ>HIVE(十二)UDF自定义函数 Hive UDF开发流程 一 创建Maven工程 二 导入依赖Jar ...

  2. Hadoop生态圈-Hive的自定义函数之UDF(User-Defined-Function)

    Hadoop生态圈-Hive的自定义函数之UDF(User-Defined-Function) 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 转载于:https://www.cnb ...

  3. Spark 2.2.1 + Hive 案例之不使用现有的Hive环境;使用现有的Hive数据仓库;UDF自定义函数

    Spark 2.2.1 + Hive 案例之不使用现有的Hive环境:使用现有的Hive数据仓库:UDF自定义函数 Spark SQL支持读写存储在Apache Hive中的数据.在Spark 2.2 ...

  4. Hadoop生态圈-hive编写自定义函数

    Hadoop生态圈-hive编写自定义函数 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任.

  5. hive中的UDF 自定义函数 : 如何创建临时/永久函数

    文章目录 一.为什么要使用自定义函数 二.自定义函数的种类 三.创建自定义函数 1.创建一个maven工程(以idea为例) 2.编写方法 要求: 调用函数在输入的字符串之前添加上字符串"H ...

  6. hive udaf_Hive自定义函数

    为什么需要自定义函数 hive的内置函数满足不了所有的业务需求. hive提供很多的模块可以自定义功能,比如:自定义函数.serde.输入输出格式等. 常见自定义函数UDF分三种: UDF(User ...

  7. Hive UDF 用户自定义函数-手机号掩盖(脱敏)

    需求分析 能够对输入数据进行非空判断.手机号位数判断 能够实现校验手机号格式,把满足规则的进行****处理 对于不符合手机号规则的数据直接返回,不处理 Maven必须配置 <dependenci ...

  8. Hive之自定义函数

    1.系统内置函数 (1)查看系统自带的函数  show functions; (2)显示自带的函数的用法  desc function upper; (3)详细显示自带的函数的用法  desc fun ...

  9. hive的自定义函数以及自定义加密函数

    hive对于敏感数据的加密还不够完善,现在开发一个udf函数,自己设置密钥(hive的加密函数等级比较低,也没有集成自己加密的密钥函数,所以自己开发一个),如果要加密一些数据则可以自己使用特定的密钥进 ...

最新文章

  1. Flutter 28: 图解 ListView/GridView 混用时滑动冲突小尝试
  2. YZYZ菜鸟编程小助手
  3. 【原】画流程图工具visio使用技巧汇总
  4. 【Python基础】GitHub 星标 8.8w+,Python 小白 100 天学习计划,从新手到大师!
  5. 5, Data Augmentation
  6. python mockito arg_that_wqingxiao
  7. python中pip不是内部或外部命令_解决pip不是内部或外部命令
  8. get post put delete在vue中传参方式
  9. 「雕爷学编程」Arduino动手做(20)—水银开关模块
  10. Linux MySQL单实例源码编译安装5.6
  11. 编写代码注释的最佳实践
  12. android os自动联网,联网设置指南
  13. atitit.元编程总结 o99
  14. Wysistat与Webtrends比较
  15. UBT19:ubuntu安装qq与微信
  16. 电力网络安全监测装置_10月 长沙 电力监控系统安全防护技术研修班
  17. ERP管理软件哪家好?比较好的ERP管理系统软件推荐
  18. 阿里云服务器验证码不能显示解决办法java.lang.Error: Probable fatal error:No fonts found
  19. 通过镜像安装torch,torchvision
  20. 记第一次挖洞交洞历程

热门文章

  1. 如何判断生成的交易策略(EA)是好是坏?
  2. 中医药文化代表东方的思维方式是智慧结晶
  3. 异常处置规则_如何负责任地处置旧计算机
  4. jQuery学习笔记--JqGrid相关操作 方法列表 备忘 重点讲解(超重要) from:jpr1990
  5. springboot javafx netty实现在线聊天和视屏
  6. 【Tracker】KCF跟踪方法百度翻译
  7. java仙侠回合制单机游戏_‎永生劫-单机仙侠回合制RPG游戏 on the App Store
  8. 520送女友什么礼物最好、5个适合送给情侣的礼物
  9. 计算机技术专业面试英语翻译,面试英文翻译:你为什么选择这个专业
  10. 区块链、货币和社交扩展性