好程序员大数据学习路线分享 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/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)重启进行测试
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/69913892/viewspace-2654133/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/69913892/viewspace-2654133/
本文深入探讨Hive中用户自定义函数(UDF)的必要性、类型及实现方式,包括一对一的UDF、多对一的UDAF和一对多的UDTF,并提供了详实的代码示例和部署指南。
1091

被折叠的 条评论
为什么被折叠?



