虽然Hive已经提供了很多内置的函数,比如count()、sum(),但是还是不能满足用户的需求,因此提供了自定义函数供用户自己开发函数来满足自己的需求。本实例通过编写自己的UDF,实现通过一个人的出生日期,计算其所属的星座。

一、自定义函数分类

UDF(User-Defined-Function)用户自定义函数,输入一个数据然后产生一个数据;
UDAF(User-Defined Aggregation Function)用户自定义聚合函数,多个输入数据然后产生一个输出参数;
UDTF(User-Defined Table-generating Function)用户自定义表生成函数,输入一行数据生成N行数据

二、自定义函数流程

要想在Hive中完成自定义函数的操作,要按照如下的流程进行操作:

1、自定义Java类并继承org.apache.hadoop.hive.ql.exec.UDF;

2、覆写evaluate函数,evaluate函数支持重载;

3、把程序打包放到hive所在服务器;

4、进入hive客户端,添加jar包;

5、创建关联到Java类的Hive函数;

6、Hive命令行中执行查询语句:select id, 方法名(name) from 表名——得出自定义函数输出的结果。

三、自定义函数实现

1、创建java类

新建java工程,导入项目依赖包hive-exec-x.x.x.jar,创建类UDFDemo如下:

package cn.hust.book.bigdata;
import java.text.SimpleDateFormat;
import java.util.Calendar;import org.apache.hadoop.hive.ql.exec.Description;
import org.apache.hadoop.hive.ql.exec.UDF;@Description(name="UDFDemo", value="_FUNC_(date)-from the input date string"+"or separate month and day arguments,returns the sign of the UDFDemo",
extended ="Example :\n"+"> SELECT _FUNC_(data_string) from src;\n"+ ">SELECT _FUNC_(mouth,day0) FORM src;")public class UDFDemo extends UDF {private SimpleDateFormat df;public UDFDemo(){df= new SimpleDateFormat("yyyy-MM-dd");}public String evaluate(String date_str) throws Exception{int month;int day;try{java.util.Date bday = df.parse(date_str);Calendar cal = Calendar.getInstance();cal.setTime(bday);month = cal.get(Calendar.MONTH)+1;day = cal.get(Calendar.DAY_OF_MONTH);}catch (Exception e) {return null;}if(month==1){if(day<20){return "魔蝎座";}else{return "水瓶座";}}if(month==2){if(day<19){return "水瓶座";}else{return "双鱼座";}}if(month==3){if(day<21){return "双鱼座";}else{return "白羊座";}}if(month==4){if(day<20){return "白羊座";}else{return "金牛座";}}if(month==5){if(day<21){return "金牛座";}else{return "双子座";}}if(month==6){if(day<22){return "双子座";}else{return "巨蟹座";}}if(month==7){if(day<23){return "巨蟹座";}else{return "狮子座";}}if(month==8){if(day<23){return "狮子座";}else{return "处女座";}}if(month==9){if(day<23){return "处女座";}else{return "天秤座";}}if(month==10){if(day<24){return "天秤座";}else{return "天蝎座";}}if(month==11){if(day<23){return "天蝎座";}else{return "射手座";}}if(month==12){if(day<22){return "射手座";}else{return "摩羯座";}}return null;}/** 测试*/public static void main(String[] args) throws Exception{UDFDemo demo =new UDFDemo();String date_str = "2009-04-15";System.out.println("result:"+demo.evaluate(date_str));}}

编写一个UDF,关键在于自定义Java类需要继承UDF类并实现evaluate()函数。因为在hive客户端执行查询时,查询中每处应用到这个函数的地方都会对这个类进行实例化。对于每行输入都会调用evaluate()函数,evaluate()函数处理后的值会返回给hive。

2、项目打包

将项目在eclipes中打包为jar包并命名为HiveUDF.jar,打包后上传到服务器指定目录,此处我们选择/home/hadoop/workspace/dhp/HiveUDF目录,如图所示:

3、加载样本数据集

进入到hive客户端,创建数据表:

CREATE TABLE IF NOT EXISTS userinfo(
name    STRING ,    //姓名
bday    STRING ,    //出生日期
)
ROW FORMAT DELIMITED FIELDS TERMINATED BY ',';

将样本数据集加载到userinfo表中:

hive> LOAD DATA LOCAL INPATH '样本数据集地址'  > INTO TABLE userinfo;

我们的样本数据集内容如下(地址:/home/hadoop/workspace/dhp/HiveUDF/person.txt):

4、添加jar包

在hive客户端,将HiveUDF.jar文件加载到类路径:

hive> add jar /home/hadoop/workspace/dhp/HiveUDF/HiveUDF.jar


5、创建关联到Java类的hive函数

通过CREATE FUNCTION语句定义好使用这个java类的函数:

hive> CREATE TEMPORARY FUNCTION HiveUDF> AS 'cn.hust.book.bigdata.UDFDemo';  //cn.hust.book.bigdata.UDFDemo对应java程序包名+类名


6、执行查询

到目前为止,这个判断星座的UDF可以像其他函数一样使用了,首先,我们看一下HiveUDF()函数的描述:

hive> DESCRIBE FUNCTION HiveUDF;

hive> SELECT name,bday,HiveUDF(bday) from userinfo;


当我们使用完自定义UDF后,可通过如下命令删除此函数:

hive> DROP TEMPORARY FUNCTION HiveUDF;

最后,附上源码+依赖包+HiveUDF.jar下载地址:
链接:https://pan.baidu.com/s/17BrNv5HciFL9GW3QmY4fIA
密码:xeal

hive自定义函数UDF的使用方法相关推荐

  1. Hive 自定义函数UDF入门

    1.为什么要用自定义函数 1.1 hive的内置函数满足不了的业务需求,这时候就需要使用自定义函数 1.2 hive的自定义函数有那些 1.UDF  一对一输出输入(本章使用) 2.UDTF 一对多输 ...

  2. Hive自定义函数UDF、UDAF、UDTF

    0.依赖 <dependencies><!--添加hive依赖--><dependency><groupId>org.apache.hive</g ...

  3. Hive内置运算函数,自定义函数(UDF)和Transform

    4.Hive函数 4.1 内置运算符 内容较多,见<Hive官方文档>   4.2 内置函数 内容较多,见<Hive官方文档> https://cwiki.apache.org ...

  4. hive 元数据 自定义_如何在Hive中创建自定义函数UDF及如何直接通过Impala的同步元数据重用UDF的jar文件-阿里云开发者社区...

    如何在Hive中创建自定义函数UDF及使用 如何在Impala中使用Hive的自定义函数 UDF函数开发 使用Intellij工具开发Hive的UDF函数,进行编译: 1.使用Intellij工具通过 ...

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

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

  6. 2021年大数据Hive(八):Hive自定义函数

    全网最详细的Hive文章系列,强烈建议收藏加关注! 后面更新文章都会列出历史文章目录,帮助大家回顾知识重点. 目录 系列历史文章 前言 Hive自定义函数 一.概述 1.UDF(User-Define ...

  7. Hive自定义函数入门实例

    概念 UDF函数一共分为三种类型: ​ UDF-一进一出,给定一个参数,输出一个处理后的数据 ​UDAF-多进一出,属于聚合函数,类似于count.sum等函数 ​UDTF-一进多出,属于一个参数,返 ...

  8. Hive 史上最全面的大数据学习第九篇(五) Hive 自定义函数 每一天都是美好的一天!

    Hive概述 & 安装方式详解 Hive表操作 Hive表分类 Hive Sql 操作 Hive 自定义函数 Hive On HBase 六.Hive 自定义函数 在Hive当中又系统自带的函 ...

  9. hive自定义函数-身份证号合法性判断

    hive自定义函数-身份证号合法性判断 简要 代码 简要 身份证号合法性判断: 若为18位身份证号: 1.第18位数字,应该在身份证号最后一位校验位数字中 2.前17为数字分别乘以对应的加权因子,累加 ...

最新文章

  1. 为什么华为在发布会不提鸿蒙,华为又要开发布会?这次没有手机,鸿蒙系统要当主角!...
  2. orika java_Orika JavaBean映射工具探秘
  3. Three.js中使用requestAnimationFrame方法实现立方体转动和小球跳动的动画
  4. IIS 8.5配置.net网站[花了半个多小时]
  5. WinSock I/O 模型 -- WSAEventSelect 模型
  6. poj2104 k-th number 主席树入门讲解
  7. MySQL服务器的启动与停止
  8. 极限学习机ELM回归预测及其MATLAB代码实现
  9. smartforms 双面打印 设置
  10. T1-商贸宝,提取暂存单据提示没有权限
  11. PSM+DID 效果评估python demo 、线性分类模型+双重差分法
  12. 前后落差大用什么词语_形容前后反差大的词语
  13. 华硕飞行堡垒7按Fn+F5电脑显示屏不显示风扇模式
  14. JavaScript?静下心来的研究之路
  15. SPU、SKU、SKC、ARPU是什么
  16. python开源库——h5py快速指南
  17. Android TV Demo 工程,其中包含 TV 常用的自定义控件,飞框效果实现,外边框效果实现,UI 控件焦点自动处理,使 TV 开发更简单,更高效。
  18. OSChina 周四乱弹 —— 剁手过双十一
  19. 基于Navicat管理工具实现以客户为导向的数据库基本操作
  20. 阿里P7晒工资条,看完真的扎心了……

热门文章

  1. wps如何设置文字底纹
  2. Spring 容器到底是个什么
  3. Jet8让社交媒体互动转化盈利机制成为可能
  4. 值得入手的投影仪,好的家用投影仪如何选择?
  5. C/C++投骰子游戏
  6. java 后端如何处理数据库字段类型为Json格式的方法
  7. 跟李沐学AI part3
  8. B05 - 033、元数据信息FSimage以及edits和secondaryNN的作用
  9. 努比亚手机浏览器 安全证书失效_「前沿」小米10安卓11尝鲜版来了 | 倪飞出任中兴手机总经理...
  10. Uni-app 手机号+验证码登录 用户名密码登录登出