千家信息网

怎么编写UDF函数

发表于:2026-11-02 作者:千家信息网编辑
千家信息网最后更新 2026年11月02日,本篇内容主要讲解"怎么编写UDF函数",感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习"怎么编写UDF函数"吧!1.为什么需要UDF?1)、因为内部函数没法满足
千家信息网最后更新 2026年11月02日怎么编写UDF函数

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

1.为什么需要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有效)

package edu.qianfeng.UDF;import org.apache.hadoop.hive.ql.exec.UDF;/** * 使用Java 自定义UDF * @author lyd * *1603 1603_class */public class FirstUDF extends UDF{ //重写evaluate() public String evaluate(String str){ //判断 if(str == null){ return null; } return str+"_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有效)

package edu.qianfeng.UDF;import org.apache.hadoop.hive.ql.exec.UDF;import org.json.JSONException;import org.json.JSONObject;public class KeyToValue extends UDF{ public String evaluate(String str,String key){ if(str == null || key == null){ return null; } //sex=1&hight=180&weight=130&sal=28000 //{sex:} String str1 = str.replace("=", ":"); String str2 = str1.replace("&", ","); String str3 = "{"+str2+"}"; String value = ""; try { JSONObject jo = new JSONObject(str3); value = jo.get(key).toString(); } catch (JSONException e) { e.printStackTrace(); } return value; } public static void main(String[] args) { System.out.println(new KeyToValue().evaluate("sex=1&hight=180&weight=130&sal=28000&facevalue=900", "facevalue")); }}

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

hive.aux.jars.path $HIVE_HOME/auxlib

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;

第四种:(做成永久性)

package edu.qianfeng.UDF;import java.text.ParseException;import java.text.SimpleDateFormat;import java.util.Calendar;import java.util.Date;import org.apache.hadoop.hive.ql.exec.UDF;/** * 根据出生年月获取周岁 * @author lyd * * 2000-04-19 17 * 2000-04-20 16 * 2000-04-21 16 * */public class BirthdayToAge extends UDF{ public static void main(String[] args) { System.out.println(new BirthdayToAge().evaluate("2000-04-20")); } public String evaluate(String birthday){ if(birthday == null || birthday.trim().isEmpty()){ return null; } String age = ""; try { //获取出生时间 SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); //获取出生的时间戳 long bithdayts = sdf.parse(birthday).getTime(); //获取今天的时间戳 long nowts = new Date().getTime(); //获取从出生到现在有多少秒 long alldays = (nowts - bithdayts)/1000/60/60/24; if(alldays < 0){ return null; } //判断闰年 int birthdayyear = Integer.parseInt(birthday.split("-")[0]); Calendar ca = Calendar.getInstance(); int nowyear = ca.get(Calendar.YEAR); //循环找 int rnday = 0; for (int i = birthdayyear; i < nowyear; i++) { if((i%400 == 0) || (i%4 == 0 && i0 != 0)){ rnday ++ ; } } //将闰年的额天数减掉 age = (alldays-rnday)/365+""; } catch (ParseException e) { return null; } return age; } }

需要对源码编译。 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

import com.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函数"有了更深的了解,不妨来实际操作一番吧!这里是网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!

函数 测试 有效 时间 用户 加好 自定 内容 文件 方法 目录 闰年 学习 实用 更深 一对一 兴趣 功能 命令 天数 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 互联网和科技创新 互联网科技卖菜 网络科技有限互联网 盛创互联网科技有限公司 哈尔滨新华互联网科技 顺网科技2021年互联网排名 青岛中康互联网医疗科技有限公司 济南华为互联网科技产业总部基地 宁波青枫互联网科技有限公司 重庆威客帮互联网科技 南山科技园互联网公司有哪些 燊美集互联网科技有限公司 为客找房互联网科技公司怎么样 华中科技大学互联网的牛人 杭州披云加互联网科技有限公司 广东鹅鹅鹅互联网科技有限公司 吉林省码上互联网科技电话 互联网科技接地气 互联网科技和医药行业 互联网的科技体现在哪里 互联网品科技 天扬科技互联网广告 移动互联网科技股 汽车互联网创新科技园 恒生互联网科技指数跳水 链环科技传统企业怎么转型互联网 华夏恒生互联网科技013171 科技互联网专业务虚会材料 每日互联网科技新闻 广州全民伙伴互联网科技有限公司
0