Hive提供了很多內建函數來滿足您的計算需求,您也可以通過創建自定義函數(UDF)來滿足不同的計算需求。UDF在使用上與普通的內建函數類似。本文為您介紹自定義函數的開發和使用流程。
背景信息
UDF分類如下表。
UDF分類 | 描述 |
UDF(User Defined Scalar Function) | 自定義標量函數,通常稱為UDF。其輸入與輸出是一對一的關系,即讀入一行數據,寫出一條輸出值。 |
UDTF(User Defined Table-valued Function) | 自定義表值函數,用來解決一次函數調用輸出多行數據場景的,也是唯一一個可以返回多個字段的自定義函數。 |
UDAF(User Defined Aggregation Function) | 自定義聚合函數,其輸入與輸出是多對一的關系,即將多條輸入記錄聚合成一條輸出值,可以與SQL中的Group By語句聯合使用。 |
開發UDF
- 使用IDE,創建Maven工程。工程基本信息如下,您可以自定義groupId和artifactId。
<groupId>org.example</groupId> <artifactId>hiveudf</artifactId> <version>1.0-SNAPSHOT</version>
- 添加pom依賴。
<dependency> <groupId>org.apache.hive</groupId> <artifactId>hive-exec</artifactId> <version>2.3.7</version> <exclusions> <exclusion> <groupId>org.pentaho</groupId> <artifactId>*</artifactId> </exclusion> </exclusions> </dependency>
- 創建一個類,繼承Hive UDF類。類名您可以自定義,本文示例中類名為MyUDF。
package org.example; import org.apache.hadoop.hive.ql.exec.UDF; /** * Hello world! * */ public class MyUDF extends UDF { public String evaluate(final String s) { if (s == null) { return null; } return s + ":HelloWorld"; } }
- 將自定義的代碼打成JAR包。在pom.xml所在目錄,執行如下命令制作JAR包。
mvn clean package -DskipTests
target目錄下會出現hiveudf-1.0-SNAPSHOT.jar的JAR包,即代表完成了UDF開發工作。
使用UDF
使用文件傳輸工具,將生成的JAR包上傳到集群root目錄。
本示例使用了文件傳輸工具(SSH Secure File Transfer Client)。
上傳JAR包至HDFS。
通過SSH方式登錄集群,詳情請參見登錄集群。
執行以下命令,將JAR包上傳到HDFS。
hadoop fs -put hiveudf-1.0-SNAPSHOT.jar /user/hive/warehouse/
您可以通過
hadoop fs -ls /user/hive/warehouse/
命令,查看是否上傳成功。待返回信息如下所示表示上傳成功。Found 1 items -rw-r--r-- 1 xx xx 2668 2021-06-09 14:13 /user/hive/warehouse/hiveudf-1.0-SNAPSHOT.jar
創建UDF函數。
執行以下命令,進入Hive命令行。
hive
執行以下命令,應用生成的JAR包創建函數。
create function myfunc as "org.example.MyUDF" using jar "hdfs:///user/hive/warehouse/hiveudf-1.0-SNAPSHOT.jar";
代碼中的
myfunc
是UDF函數的名稱,org.example.MyUDF
是開發UDF中創建的類,hdfs:///user/hive/warehouse/hiveudf-1.0-SNAPSHOT.jar
為上傳JAR包到HDFS的路徑。當出現以下信息時,表示創建成功。
Added [/private/var/folders/2s/wzzsgpn13rn8rl_0fc4xxkc00000gp/T/40608d4a-a0e1-4bf5-92e8-b875fa6a1e53_resources/hiveudf-1.0-SNAPSHOT.jar] to class path Added resources: [hdfs:///user/hive/warehouse/myfunc/hiveudf-1.0-SNAPSHOT.jar]
說明您也可以通過命令
SHOW FUNCTIONS LIKE '*myfunc*
',驗證函數是否創建成功。
執行以下命令,使用UDF函數。
該函數與內置函數使用方式一樣,直接使用函數名稱即可訪問。
select myfunc("abc");
返回如下信息。
OK abc:HelloWorld
相關文檔
文檔內容是否對您有幫助?