怎么编写UDF函数

怎么编写UDF函数

本篇内容主要讲解“怎么编写UDF函数”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“怎么编写UDF函数”吧!

1.为什么需要UDF?

怎么编写UDF函数

1)、因为内部函数没法满足需求。

2)、hive它本身就是一个灵活框架,允许用自定义模块功能,如可以自定义UDF、serde、输入输出等。

2.UDF是什么?

UDF:user difine function,用户自定义函数,一对一。常用 udaf:user define aggregate function,用户自定义聚合函数,多对一。 udtf:user define table_generate function,用户自定义表生成函数,一对多。

3.怎么编写UDF函数??

1)、该类需要继承UDF,重写evaluate(),允许该方法重载。

2)、也可以继承 generic UDF,需要重写 initliaze() 、 getDisplay() 、 evaluate()

4.UDF的使用

第一种:(当前session有效)

packageedu.qianfeng.UDF;importorg.apache.hadoop.hive.ql.exec.UDF;/***使用Java 自定义UDF* @author lyd**16031603_class*/publicclassFirstUDF extendsUDF{ //重写evaluate() publicStringevaluate(Stringstr){ //判断 if(str == null){ returnnull; } returnstr+"_class"; }}

1、添加自定UDF的jar包

hive>add jar /home/h3h.jar;

2、创建临时函数

hive>create temporary function myfunc as "edu.qianfeng.UDF.FirstUDF";

3、测试是否添加好:

show functions;select myfunc("1603");

4、确定无用时可以删除:

drop temporary function myfunc;

第二种:(当前session有效)

packageedu.qianfeng.UDF;importorg.apache.hadoop.hive.ql.exec.UDF;importorg.json.JSONException;importorg.json.JSONObject;publicclassKeyToValue extendsUDF{ publicStringevaluate(Stringstr,Stringkey){ if(str == null|| key == null){ returnnull; } //sex=1&hight=180&weight=130&sal=28000 //{sex:} Stringstr1 = str.replace("=", ":"); Stringstr2 = str1.replace("&", ","); Stringstr3 = "{"+str2+"}"; Stringvalue = ""; try{ JSONObject jo = newJSONObject(str3); value = jo.get(key).toString(); } catch(JSONException e) { e.printStackTrace(); } returnvalue; } publicstaticvoidmain(String[] args) { System.out.println(newKeyToValue().evaluate("sex=1&hight=180&weight=130&sal=28000&facevalue=900", "facevalue")); }}

1、添加自定UDF的jar包(hive.aux.jars.path在该目录下的jar会在hive启动时自动加载)

<property><name>hive.aux.jars.path</name><value>$HIVE_HOME/auxlib</value></property>

cp /home/h3h.jar $HIVE_HOME/auxlib/

2、启动hive,创建临时函数

hive>create temporary function ktv as "edu.qianfeng.UDF.KeyToValue";

3、测试是否添加好:

show functions;select myfunc("1603");

4、确定无用时可以删除:

drop temporary function myfunc;

第三种:(当前session有效)

1、创建一个初始化文件:

vi ./init-hiveadd jar /home/h3h.jar;create temporary function ktv1 as "edu.qianfeng.UDF.KeyToValue";

2、启动使用命令:

hive -i ./init-hive

3、测试是否添加好:

show functions;select myfunc("1603");

4、确定无用时可以删除:

drop temporary function myfunc;

第四种:(做成永久性)

packageedu.qianfeng.UDF;importjava.text.ParseException;importjava.text.SimpleDateFormat;importjava.util.Calendar;importjava.util.Date;importorg.apache.hadoop.hive.ql.exec.UDF;/***根据出生年月获取周岁* @author lyd**2000-04-1917*2000-04-2016*2000-04-2116**/publicclassBirthdayToAge extendsUDF{publicstaticvoidmain(String[] args) { System.out.println(newBirthdayToAge().evaluate("2000-04-20")); } publicStringevaluate(Stringbirthday){ if(birthday == null|| birthday.trim().isEmpty()){ returnnull; } Stringage = ""; try{ //获取出生时间 SimpleDateFormatsdf = newSimpleDateFormat("yyyy-MM-dd"); //获取出生的时间戳 longbithdayts = sdf.parse(birthday).getTime(); //获取今天的时间戳 longnowts = newDate().getTime(); //获取从出生到现在有多少秒 longalldays = (nowts - bithdayts)/1000/60/60/24; if(alldays < 0){ returnnull; } //判断闰年 intbirthdayyear = Integer.parseInt(birthday.split("-")[0]); Calendarca = Calendar.getInstance(); intnowyear = ca.get(Calendar.YEAR); //循环找 intrnday = 0; for(inti = birthdayyear; i < nowyear; i++) { if((i%400== 0) || (i%4== 0&& i%100!= 0)){ rnday ++ ; } } //将闰年的额天数减掉 age = (alldays-rnday)/365+""; } catch(ParseExceptione) { returnnull; } returnage; } }

需要对源码编译。 1)将写好的Jave文件拷贝到~/install/hive-0.8.1/src/ql/src/java/org/apache/hadoop/hive/ql/UDF/

cd ~/install/hive-0.8.1/src/ql/src/java/org/apache/hadoop/hive/ql/UDF/ls -lhgt |head

2)修改~/install/hive-0.8.1/src/ql/src/java/org/apache/hadoop/hive/ql/exec/FunctionRegistry.java,增加import和RegisterUDF

importcom.meilishuo.hive.UDF.UDFIp2Long;//添加importregisterUDF("ip2long", UDFIp2Long.class, false); //添加register

3)在~/install/hive-0.8.1/src下运行ant -Dhadoop.version=1.0.1 package

cd ~/install/hive-0.8.1/srcant -Dhadoop.version=1.0.1 package

4)替换exec的jar包,新生成的包在/hive-0.8.1/src/build/ql目录下,替换链接

cp hive-exec-0.8.1.jar /hadoop/hive/lib/hive-exec-0.8.1.jar.0628rm hive-exec-0.8.1.jarln -s hive-exec-0.8.1.jar.0628 hive-exec-0.8.1.jar

5)重启进行测试

到此,相信大家对“怎么编写UDF函数”有了更深的了解,不妨来实际操作一番吧!这里是恰卡编程网网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!

发布于 2021-12-22 21:59:35
收藏
分享
海报
0 条评论
40
上一篇:创建RDD的方式有哪些 下一篇:TCP点对点和UDP广播怎么实现
目录

    0 条评论

    本站已关闭游客评论,请登录或者注册后再评论吧~

    忘记密码?

    图形验证码