admin管理员组文章数量:1794759
hive自定义函数UDF的使用方法
虽然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.jar5、创建关联到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下载地址: 链接:pan.baidu/s/17BrNv5HciFL9GW3QmY4fIA 密码:xeal
版权声明:本文标题:hive自定义函数UDF的使用方法 内容由林淑君副主任自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:http://www.xiehuijuan.com/baike/1686495584a73927.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论