为了满足用户的个性化需求,Hive被设计成了一个很开放的系统,很多内容都可以定制,主要包括:
1)、文件格式;
2)、内存中的数据格式,如Hadoop的Writable/Text;
3)、用户提供的MapReduce脚本,不管使用何种语言都可以通过标准的stdin/stdout传输数据;
4)、用户自定义函数。
本节我们主要学习用户自定义函数。虽然Hive已经提供了很多内存的函数,但是还是不能,满足用户的需求,因此有提供了自定义函数供用户自己开发函数来满足自己的需求。之定义函数主要分三类:
1)、UDF(User-Defined-Function)用户自定义函数,输入一个数据然后产生一个数据;
2)、UDAF(User-Defined Aggregation Function)用户自定义聚合函数,多个输入数据然后产生一个输出参数;
3)、UDTF(User-Defined Table-generating Function)用户自定义表生成函,数,输入一行数据生成N行数据。
UDF
现在我们开始学习如何来开发自己的UDF函数。假设我们现在有一个被保存在littlebigdata.txt文件中的数据集:
- edward capriolo,edward@media6degrees.com,2-12-1981,209.191.139.200,M,10
- bob,bob@test.net,10-10-2004,10.10.10.1,M,50
- sara connor,sara@sky.net,4-5-1974,64.64.5.1,F,2
- ...
接下来我们顶一个Hive加载这个数据集:
- hive> CREATE TABLE IF NOT EXISTS littlebigdata(
- > name STRING COMMENT '姓名',
- > email STRING COMMENT '邮箱',
- > birthday STRING COMMENT '生日',
- > ip STRING COMMENT 'ip',
- > gender STRING COMMENT '性别',
- > anum INT)
- > ROW FORMAT DELIMITED FIELDS TERMINATED BY ',';
- hive> LOAD DATA LOCAL INPATH '${env:HOME}/littlebigdata.txt'
- > INTO TABLE littlebigdata;
我们接下来会写一个自定义的UDF根据数据集中的生日计算对应星座,首先新类要继承org.apache.hadoop.hive.ql.exec.UDF类,然而UDF类并不是一个抽象类,其中并没有用户自定义函数必须的evaluate()方法,子类必须实现一个或多个evaluate方法给Hive框架调用,这个evaluate方法正是所有实现类的逻辑部分所在,只有用户自己来写方法了:
- package org.apache.hadoop.hive.contrib.udf.example;
- import java.text.SimpleDateFormat;
- import java.util.Date;
- import org.apache.hadoop.hive.ql.exec.UDF;
- import org.apache.hadoop.hive.ql.exec.Description;
- @Description(name = "Zodiac",
- value = "FUNC_(date) - from the input data string " +
- "or separate month and day arguments,return the sign of the Zodiac.",
- extended = "Example:\n >SELECT _FUNC_(date_string) FROM src;\n" +
- " > SELECT _FUNC_(month,day) FROM src;")
- public class ZodiacSignUDF extends UDF{
- private SimpleDateFormat df = null;
- /**
- * 在默认构造函数中初始化df
- */
- public ZodiacSignUDF(){
- df = new SimpleDateFormat("MM-dd-yyyy");
- }
- /**
- * 由出生日期获取星座
- * @param birthday -Date
- * @return
- */
- public String evaluate(Date birthday){
- return this.evaluate(birthday.getMonth() + 1,birthday.getDay());
- }
- /**
- * 由出生日期获取星座
- * @param birthday -String
- * @return
- */
- public String evaluate(Date birthday){
- Date date = null;
- try{
- date = df.parse(birthday);
- }catch(Excetion e){
- //如果日期转换失败,就表明星座是未知的
- return null;
- }
- return this.evaluate(date.getMonth() + 1,date.getDay());
- }
- /**
- * 由月份和出生日获取星座
- * @param month -int
- * @param day -int
- * @return
- */
- public String evaluate(Integer month,Integer day){
- if(month == 1){
- if(day < 20){
- return "Capricorn";
- }else{
- return "Aquarius";
- }
- }else if(month == 2){
- if(day < 19){
- return "Aquarius";
- }else{
- return "Pisces";
- }
- }
- /** ... other months here */
- return null;
- }
- }
在HiveQL的执行中,没处理一行都会调用一次ZodiacSignUDF类的实例,然后将每一行的出生一起传给evaluate()方法并得到对应的星座返回给Hive。
那么接下来的问题是如何使用这个自定义函数呢?
首先需要用户便以这个类并将之打成一个jar包,然后将jar文件添加到Hive的classpath并使用CREATE FUNCTION语句将之定义为一个Hive能使用的方法:
- hive> ADD JAR /full/path/to/zodiac.jar;
- hive> CREATE TEMPORARY FUNCTION zodiac
- AS 'org.apache.hadoop.hive.contrib.udf.exampl.ZodiacSignUDF';
当然,上面的函数添加方法只能在Hive session会话期间使用,session结束后如还想使用该函数,那就必须再将上面的两部操作做一遍。如果这个函数是经常使用的,那么这么做就太繁琐了,这种情况下可以把上面的两操作语句添加到$HOME/.hiverc文件中作为全局函数,就想使用hive的内置行是一样:
- hive> SELECT name,birthday,zodiac(birthday) FROM littlebigdata;
- edward capriolo 2-12-1981 Aquarius
- bob 10-10-2004 Libra
- sara 4-5-1974 Aries
接着我们来看怎么删除一个·自定义函数:
相关推荐
简单介绍了hive自定义函数的编写步骤以及使用。
hive的udf函数实现
udf函数,用户自定义函数,可以直接在sql语句中计算的函数 优点: 允许实现模块化的程序设计、方便修改代码、增加函数 UDF的执行速度很快,通过缓存计划在语句重复执行时降低代码的编译开销,比存储方法的执行效率...
udf开发–做个简单脱敏udf保留前5位,后面全部替换成*****
NULL 博文链接:https://chengjianxiaoxue.iteye.com/blog/2235666
Hive自定义函数 一. UDF(user defined function) 背景 系统内置函数无法解决所有的实际业务问题,需要开发者自己编写函数实现自身的业务实现诉求。 应用场景非常多,面临的业务不同导致个性化实现很多,故udf...
地址转换成经纬度+两地址间距离计算+省市区位置解析(Java代码) Hive自定义函数的封装
hive-udfhive自定义函数主要实现hive3种自定义函数1,udf函数,主要用于处理一对一数据处理2,udtf函数,主要用于处理一对多数据处理2,udaf函数,主要用与处理多对一数据聚合处理
自定义 hive udf udaf 有url解析,获取网站主域名,根据ip获取区域码,有rownum,列聚合以及一些业务实现udf。
详细介绍如何开发hive自定义永久函数,配套有测试数据
* 脱敏UDF函数 * 功能:对一些敏感信息进行脱敏处理,替换方式可选择自定义替换,如'#','*'等,,如不指定脱敏符号,使用个随机字符替换 * 脱敏位置可自定义,不指定位置,会对数据进行全脱敏 * 例如身份证信息: ...
第 7 章 函数 7.1 系统内置函数 1)查看系统自带的函数 ...2)当 Hive 提供的内置函数无法满足你的业务处理需要时,此时就可以考虑使用用户自定义函数(UDF:user-defined function)。 3)根据用户自定义函数
Hive 自定义函数UDF开发手把手教程—— 创建临时函数和永久函数代码,具体创建过程参考https://blog.csdn.net/helloxiaozhe/article/details/102498567
hive不直接支持分组取TopN的操作,需要自定义udf函数打成jar包添加到hive运行环境中
· 获得创建用户自定义函数(UDF)的最佳方法。 · 了解应该使用的Hive模式以及应该避免的反模式。 · 将Hive和其他数据处理程序进行整合。 · 对于NoSQL数据库和其他数据存储使用存储控制器。 · 学习在亚马逊弹性...
· 获得创建用户自定义函数(UDF)的最佳方法。 · 了解应该使用的Hive模式以及应该避免的反模式。 · 将Hive和其他数据处理程序进行整合。 · 对于NoSQL数据库和其他数据存储使用存储控制器。 · 学习在亚马逊弹性...
22.Hive中使用自定义UDF实现日期格式转换 23. HiveServer2的介绍及三种连接方式 24.Hive元数据、fetch task和严格模式的介绍 第3章:Sqoop Sqoop及用户行为分析案例 25.CDH版本框架的介绍 26. CDH版本框架的环境...
hive入门级详解,包括数仓与传统数据库的比对,hive的存储结构与存储原理,分区分桶、hql如何转换成mapreduce、UDF自定义函数等
Hive自定义函数的使用——useragent解析 从日志数据中分析一下操作系统、浏览器、版本使用情况,但是Hive中的函数不能直接解析useragent,于是可以写一个UDF来解析。useragent用于表示用户的当前操作系统,浏览器版本...
Hive相关知识; Hive是基于Hadoop的数据仓库工具,可以用来对HDFS中存储的数据...Hive还允许用户编写自己定义的函数UDF,用来在查询中使用。;;;6.2 Hive组件架构;6.2 Hive组件架构;6.2 Hive组件架构;;6.3 下载和解压安装