1、UDF的定義
UDF(User-Defined Functions)即是使用者定義的hive函數。hive自帶的函數并不能完全滿足業務需求,這時就需要我們自定義函數了
UDF的分類
UDF:one to one,進來一個出去一個,row mapping。是row級别操作,如:upper、substr函數
UDAF:many to one,進來多個出去一個,row mapping。是row級别操作,如sum/min。
UDTF:one to many ,進來一個出去多個。如alteral view與explode
這三類中,我們隻對UDF類的函數進行改寫
2、UDF函數的編寫
(1)pom檔案配置
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
4.0.0
com.wsk.bigdata
g6-hadoop
1.0
g6-hadoop
1.7
1.7
UTF-8
2.6.0-cdh5.7.0
1.1.0-cdh5.7.0
nexus-aliyun
http://maven.aliyun.com/nexus/content/groups/public
cloudera
https://repository.cloudera.com/artifactory/cloudera-repos
org.apache.hadoop
hadoop-client
${hadoop.version}
junit
junit
4.11
test
org.apache.hive
hive-exec
${hive.version}
org.apache.maven.plugins
maven-compiler-plugin
2.4
1.7
1.7
UTF-8
(2)UDF函數編寫
(3)打jar包
(4)上傳jar包
[[email protected] lib]$ rz
[[email protected] lib]$ ll g6-hadoop-1.0.jar
-rw-r--r--. 1 hadoop hadoop 11447 Apr 19 2019 g6-hadoop-1.0.jar
注意:如果jar包是上傳到$HIVE_HOME/lib/目錄以下,就不需要執行add指令了
添加jar包到hive
文法:add jar +jar包所在的目錄/jar包名字
hive> add jar /home/hadoop/data/hive/g6-hadoop-1.0.jar;
(5)在hive中建立UDF函數
建立臨時函數 -----隻對目前黑視窗有效
CREATE TEMPORARY FUNCTION function_name AS class_name;
function_name函數名
*******class_name 類路徑,包名+類名********* 這裡就是你寫的UDF函數的第一行的package後邊的東西然後在加個點加個類的名字
執行個體:
hive>CREATE TEMPORARY FUNCTION HelloUDF AS 'org.apache.hadoop.hive.ql.udf.HelloUDF';
OK Time taken: 0.485 seconds
hive>
hive> show functions; 【檢視可以看到HelloUDF】
測試
hive>select HelloUDF('17');
OK
Hello:17
#檢查mysql中的中繼資料,因為是臨時函數,故中繼資料中并沒有相關的資訊
mysql> select * from funcs;
Empty set (0.11 sec)
删除臨時函數 :
文法:DROP TEMPORARY FUNCTION [IF EXISTS] function_name;
測試
hive> DROP TEMPORARY FUNCTION IF EXISTS HelloUDF;
OK
Time taken: 0.003 seconds
hive> select HelloUDF('17');
FAILED: SemanticException [Error 10011]: Line 1:7 Invalid function 'HelloUDF'
##其實不删除也無所謂,重新開一個視窗即可
建立永久函數
CREATE TEMPORARY FUNCTION function_name AS class_name USING JAR path;
function_name函數名
class_name 類路徑,
包名+類名
path jar包hdfs路徑
将jar上傳到指定目錄
[[email protected] hive-1.1.0-cdh5.7.0]$ hadoop fs -mkdir /lib
[[email protected] hive-1.1.0-cdh5.7.0]$ hadoop fs -put /home/hadoop/data/hive/hive_UDF.jar /lib/
[[email protected] ~]$ hadoop fs -mkdir /lib
[[email protected] ~]$ hadoop fs -ls /lib
[[email protected] ~]$ hadoop fs -put ~/lib/g6-hadoop-1.0.jar /lib/ 把本地的jar上傳到HDFS的/lib/目錄下
[[email protected] ~]$ hadoop fs -ls /lib
建立永久生效的UDF函數
CREATE FUNCTION HelloUDF AS 'org.apache.hadoop.hive.ql.udf.HelloUDF'
USING JAR 'hdfs://hadoop001:9000/lib/g6-hadoop-1.0.jar';
#測試 hive> select HelloUDF("17") ;
OK hello:17
檢查mysql中的中繼資料,測試函數的資訊已經注冊到了中繼資料中
mysql> select * from funcs;
+---------+------------------------------+-------------+-------+------------+-----------+------------+------------+
| FUNC_ID | CLASS_NAME | CREATE_TIME | DB_ID | FUNC_NAME | FUNC_TYPE | OWNER_NAME | OWNER_TYPE |
+---------+------------------------------+-------------+-------+------------+-----------+------------+------------+
| 1 |org.apache.hadoop.hive.ql.udf.HelloUDF | 1555263915 | 6 | HelloUDF | 1 | NULL | USER |
+---------+------------------------------+-------------+-------+------------+-----------+------------+------------+
建立的永久函數可以在任何一個視窗使用,重新啟動函數也照樣可以使用