文档章节

好程序员大数据学习路线分享UDF函数

好程序员官方
 好程序员官方
发布于 08/19 15:08
字数 951
阅读 19
收藏 0

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/h2h.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启动时自动加载)

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

cp /home/h2h.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-hive
add jar /home/h2h.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 && i%100 != 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;   //添加import
registerUDF("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/src
ant -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.0628
rm hive-exec-0.8.1.jar
ln -s hive-exec-0.8.1.jar.0628 hive-exec-0.8.1.jar

5)重启进行测试

© 著作权归作者所有

好程序员官方
粉丝 0
博文 95
码字总数 123146
作品 0
东城
私信 提问
阿里年薪50WJAVA工程师转大数据学习路线!

大数据有两个方向,一个是偏计算机的,另一个是偏经济的。你学过Java,所以你可以偏将计算机的。 Java程序员想转大数据可行吗?Java是全世界使用人数最多的编程语言。不少程序员选择Java做为...

JAVA丶学习
2018/04/25
0
0
专辑|阿里开发者们的20个故事与50本书

2015年12月20日,云栖社区上线。 2018年12月20日,云栖社区3岁。 阿里巴巴常说“晴天修屋顶”。 在我们看来,寒冬中,最值得投资的是学习,是增厚的知识储备。 所以社区特别制作了这个专辑—...

云篆
2018/12/18
0
0
大数据教程(12.3)Hive函数

本篇博客博主将分享Hive函数的基础知识. 1.内置运算符(https://cwiki.apache.org/confluence/display/Hive/LanguageManual+UDF) 2.内置函数(https://cwiki.apache.org/confluence/display......

em_aaron
01/31
27
0
如何简化 SQL 语句之 UDF 实践

UDF(User Defined Function 用户自定义函数)是 SQL 环境中很关键的特性。通过写 UDF,开发者可以方便地插入常用的处理代码并在查询中使用。Apache Kylin 支持持久化的 UDF。来自华安保险的...

ApacheKylin
09/01
12
0
好程序员大数据分享Zookeeper集群管理与选举

大数据技术的学习,逐渐成为很多程序员的必修课,同时也出现了很多技术论坛供大家探讨,所以今天好程序员分享大数据技术Zookeeper集群管理与选举,大家可以一起学习! 1.集群机器监控   这通...

好程序员IT
05/27
4
0

没有更多内容

加载失败,请刷新页面

加载更多

二叉查找树的第 K 个结点

private TreeNode ret;private int cnt = 0;public TreeNode KthNode(TreeNode pRoot, int k) { inOrder(pRoot, k); return ret;}private void inOrder(TreeNode root......

Garphy
今天
4
0
windo8 weblogic

需要的软件包 现在安装jdk 则先进入你电脑自带jdk \bin目录下 然后java -jar 执行你的jar包就可以了 欢迎界面直接点击下一步,跳到更新界面,直接选择跳过 然后选择安装目录(注意:目录不要有...

恩多
今天
8
0
Activiti 批注

Activiti添加批注(comment)信息 在每次提交任务的时候需要描述一些批注信息,例如:请假流程提交的时候要描述信息为什么请假,如果领导驳回可以批注驳回原因等  1、添加批注 // 由于流程...

奔跑的android
今天
4
0
centos7命令行和图形界面的相互切换

最近安装了centos7,发现在命令行和图形界面的相互切换命令上,与centos以往版本有很大不同。 1,centos7默认安装后,跟其他版本一样,启动默认进入图形界面; 2,在图形化桌面,右击鼠标,选...

无名氏的程序员
今天
6
0
快速失败 (fail-fast) 和安全失败 (fail-safe) 的区别是什么

一:快速失败(fail—fast) 在用迭代器遍历一个集合对象时,如果遍历过程中对集合对象的内容进行了修改(增加、删除、修改),则会抛出Concurrent Modification Exception。 原理:迭代器在...

Bb进阶
今天
7
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部