好程式設計師大資料學習路線分享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/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/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 好程式設計師大資料學習路線分享高階函式程式設計師大資料函式
- 好程式設計師大資料學習路線分享函式+map對映+元祖程式設計師大資料函式
- 好程式設計師大資料學習路線分享Lambda表示式程式設計師大資料
- 好程式設計師大資料學習路線分享MAPREDUCE程式設計師大資料
- 好程式設計師大資料學習路線分享SparkSQl程式設計師大資料SparkSQL
- 好程式設計師大資料學習路線分享Scala系列之集合操作函式程式設計師大資料函式
- 好程式設計師大資料學習路線hive內部函式程式設計師大資料Hive函式
- 好程式設計師大資料學習路線分享Hbase指令學習程式設計師大資料
- 好程式設計師大資料學習路線分享大資料之字串程式設計師大資料字串
- 好程式設計師大資料學習路線分享Map學習筆記程式設計師大資料筆記
- 好程式設計師大資料學習路線分享HDFS學習總結程式設計師大資料
- 好程式設計師大資料學習路線分享hdfs學習乾貨程式設計師大資料
- 好程式設計師大資料學習路線分享Actor學習筆記程式設計師大資料筆記
- 好程式設計師大資料學習路線分享spark之Scala程式設計師大資料Spark
- 好程式設計師大資料學習路線分享HDFS讀流程程式設計師大資料
- 好程式設計師大資料學習路線分享AWK詳解程式設計師大資料
- 好程式設計師大資料學習路線分享彈性分散式資料集RDD程式設計師大資料分散式
- 好程式設計師web前端學習路線分享函式基礎程式設計師Web前端函式
- 好程式設計師大資料學習路線Hadoop學習乾貨分享程式設計師大資料Hadoop
- 好程式設計師大資料學習路線分享大資料之執行緒程式設計師大資料執行緒
- 好程式設計師大資料學習路線分享Scala系列之物件程式設計師大資料物件
- 好程式設計師大資料學習路線分享分散式檔案系統HDFS程式設計師大資料分散式
- 好程式設計師大資料學習路線分享TCP和UDP學習筆記程式設計師大資料TCPUDP筆記
- 好程式設計師大資料學習路線分享大資料之基礎語法程式設計師大資料
- 好程式設計師大資料學習路線分享Hadoop機架感知程式設計師大資料Hadoop
- 好程式設計師大資料學習路線分享什麼是Hash表程式設計師大資料
- 好程式設計師大資料學習路線分享Scala系列之抽象類程式設計師大資料抽象
- 好程式設計師大資料學習路線分享Scala系列之泛型程式設計師大資料泛型
- 好程式設計師大資料學習路線分享hive的執行方式程式設計師大資料Hive
- 好程式設計師大資料學習路線分享Scala系列之陣列程式設計師大資料陣列
- 好程式設計師大資料學習路線分享Scala分支和迴圈程式設計師大資料
- 好程式設計師大資料學習路線分享MapReduce全流程總結程式設計師大資料
- 好程式設計師大資料學習路線分享MapReduce全過程解析程式設計師大資料
- 好程式設計師大資料學習路線之大資料自學路線二程式設計師大資料
- 好程式設計師大資料學習路線之大資料自學路線一程式設計師大資料
- 好程式設計師大資料學習路線分享執行緒學習筆記二程式設計師大資料執行緒筆記
- 好程式設計師大資料學習路線分享多執行緒學習筆記程式設計師大資料執行緒筆記
- 好程式設計師大資料學習路線分享hive分割槽和分桶程式設計師大資料Hive