天天看點

hive2mysql的udf_hive中的UDF函數

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檔案配置

hive2mysql的udf_hive中的UDF函數

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

hive2mysql的udf_hive中的UDF函數

(2)UDF函數編寫

hive2mysql的udf_hive中的UDF函數

(3)打jar包

hive2mysql的udf_hive中的UDF函數
hive2mysql的udf_hive中的UDF函數

(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函數

建立臨時函數    -----隻對目前黑視窗有效

hive2mysql的udf_hive中的UDF函數

CREATE TEMPORARY FUNCTION function_name AS class_name;

function_name函數名

*******class_name 類路徑,包名+類名********* 這裡就是你寫的UDF函數的第一行的package後邊的東西然後在加個點加個類的名字

hive2mysql的udf_hive中的UDF函數
hive2mysql的udf_hive中的UDF函數

執行個體:

hive2mysql的udf_hive中的UDF函數

hive>CREATE TEMPORARY FUNCTION HelloUDF AS 'org.apache.hadoop.hive.ql.udf.HelloUDF';

OK Time taken: 0.485 seconds

hive>

hive> show functions; 【檢視可以看到HelloUDF】

hive2mysql的udf_hive中的UDF函數

測試

hive2mysql的udf_hive中的UDF函數

hive>select HelloUDF('17');

OK

Hello:17

#檢查mysql中的中繼資料,因為是臨時函數,故中繼資料中并沒有相關的資訊

mysql> select * from funcs;

Empty set (0.11 sec)

hive2mysql的udf_hive中的UDF函數

删除臨時函數 :

文法:DROP TEMPORARY FUNCTION [IF EXISTS] function_name;

測試

hive2mysql的udf_hive中的UDF函數

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'

##其實不删除也無所謂,重新開一個視窗即可

hive2mysql的udf_hive中的UDF函數

建立永久函數

hive2mysql的udf_hive中的UDF函數

CREATE TEMPORARY FUNCTION function_name AS class_name USING JAR path;

function_name函數名

class_name 類路徑,

包名+類名

path jar包hdfs路徑

hive2mysql的udf_hive中的UDF函數

将jar上傳到指定目錄

hive2mysql的udf_hive中的UDF函數

[[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

hive2mysql的udf_hive中的UDF函數

建立永久生效的UDF函數

hive2mysql的udf_hive中的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

hive2mysql的udf_hive中的UDF函數

檢查mysql中的中繼資料,測試函數的資訊已經注冊到了中繼資料中

hive2mysql的udf_hive中的UDF函數

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 |

+---------+------------------------------+-------------+-------+------------+-----------+------------+------------+

hive2mysql的udf_hive中的UDF函數

建立的永久函數可以在任何一個視窗使用,重新啟動函數也照樣可以使用