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類的函數進行改寫
pom文件配置
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.wsk.bigdata</groupId> <artifactId>g6-hadoop</artifactId> <version>1.0</version> <name>g6-hadoop</name> <properties> <maven.compiler.source>1.7</maven.compiler.source> <maven.compiler.target>1.7</maven.compiler.target> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <hadoop.version>2.6.0-cdh5.7.0</hadoop.version> <hive.version>1.1.0-cdh5.7.0</hive.version> </properties> <!--添加CDH的倉庫--> <repositories> <repository> <id>nexus-aliyun</id> <url>http://maven.aliyun.com/nexus/content/groups/public</url> </repository> <repository> <id>cloudera</id> <url>https://repository.cloudera.com/artifactory/cloudera-repos</url> </repository> </repositories> <dependencies> <!--添加Hadoop的依賴--> <dependency> <groupId>org.apache.hadoop</groupId> <artifactId>hadoop-client</artifactId> <version>${hadoop.version}</version> </dependency> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.11</version> <scope>test</scope> </dependency> <!--添加hive依賴--> <dependency> <groupId>org.apache.hive</groupId> <artifactId>hive-exec</artifactId> <version>${hive.version}</version> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>2.4</version> <configuration> <source>1.7</source> <target>1.7</target> <encoding>UTF-8</encoding> </configuration> </plugin> </plugins> </build> </project>
UDF函數編寫
打jar包
上傳jar包
[hadoop@hadoop001 lib]$ rz [hadoop@hadoop001 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;
在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上傳到指定目錄
[hadoop@hadoop hive-1.1.0-cdh5.7.0]$ hadoop fs -mkdir /lib [hadoop@hadoop hive-1.1.0-cdh5.7.0]$ hadoop fs -put /home/hadoop/data/hive/hive_UDF.jar /lib/ [hadoop@hadoop001 ~]$ hadoop fs -mkdir /lib [hadoop@hadoop001 ~]$ hadoop fs -ls /lib [hadoop@hadoop001 ~]$ hadoop fs -put ~/lib/g6-hadoop-1.0.jar /lib/ 把本地的jar上傳到HDFS的/lib/目錄下 [hadoop@hadoop001 ~]$ 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 | +---------+------------------------------+-------------+-------+------------+-----------+------------+------------+
- 創建的永久函數可以在任何一個窗口使用,重新啓動函數也照樣可以使用
官網參考地址:LanguageManual UDF