歡迎訪問我的GitHub
https://github.com/zq2599/blog_demos
內容:所有原創文章分類彙總及配套原始碼,涉及Java、Docker、Kubernetes、DevOPS等;
《hive學習筆記》系列導航
本篇概覽
- 本文是《hive學習筆記》的第九篇,前面學習的內建函式儘管已經很豐富,但未必能滿足各種場景下的個性化需求,此時可以開發使用者自定義函式(User Defined Function,UDF),按照個性化需求自行擴充套件;
- 本篇內容就是開發一個UDF,名為udf_upper,功能是將字串欄位轉為全大寫,然後在hive中使用這個UDF,效果如下圖紅框所示:
- 本篇有以下章節:
- 開發
- 部署和驗證(臨時函式)
- 部署和驗證(永久函式)
原始碼下載
- 如果您不想編碼,可以在GitHub下載所有原始碼,地址和連結資訊如下表所示:
名稱 | 連結 | 備註 |
---|---|---|
專案主頁 | https://github.com/zq2599/blog_demos | 該專案在GitHub上的主頁 |
git倉庫地址(https) | https://github.com/zq2599/blog_demos.git | 該專案原始碼的倉庫地址,https協議 |
git倉庫地址(ssh) | git@github.com:zq2599/blog_demos.git | 該專案原始碼的倉庫地址,ssh協議 |
- 這個git專案中有多個資料夾,本章的應用在hiveudf資料夾下,如下圖紅框所示:
開發
- 新建名為hiveudf的maven工程,pom.xml內容如下,有兩處需要關注的地方,接下來馬上講到:
<?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.bolingcavalry</groupId>
<artifactId>hiveudf</artifactId>
<version>1.0-SNAPSHOT</version>
<dependencies>
<dependency>
<groupId>org.apache.hive</groupId>
<artifactId>hive-exec</artifactId>
<version>1.2.2</version>
<scope>provided</scope>
<exclusions>
<exclusion>
<groupId>org.pentaho</groupId>
<artifactId>pentaho-aggdesigner-algorithm</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.apache.hadoop</groupId>
<artifactId>hadoop-common</artifactId>
<version>2.7.7</version>
<scope>provided</scope>
</dependency>
</dependencies>
</project>
- 上述pom.xml中,兩個依賴的scope為provided,因為這個maven工程最終只需要將我們們寫的java檔案構建成jar,所以依賴的庫都不需要;
- 上述pom.xml中排除了pentaho-aggdesigner-algorithm,是因為從maven倉庫下載不到這個庫,為了能快速編譯我的java程式碼,這種排除的方式是最簡單的,畢竟我用不上(另一種方法是手動下載此jar,再用maven install命令部署在本地);
- 建立Upper.java,程式碼如下非常簡單,只需存在名為evaluate的public方法即可:
package com.bolingcavalry.hiveudf.udf;
import org.apache.commons.lang.StringUtils;
import org.apache.hadoop.hive.ql.exec.UDF;
public class Upper extends UDF {
/**
* 如果入參是合法字串,就轉為小寫返回
* @param str
* @return
*/
public String evaluate(String str) {
return StringUtils.isBlank(str) ? str : str.toUpperCase();
}
}
- 編碼已完成,執行mvn clean package -U編譯構建,在target目錄下得到hiveudf-1.0-SNAPSHOT.jar檔案;
- 接下來將我們們做好的UDF部署在hive,驗證功能是否正常;
部署和驗證(臨時函式)
- 如果希望UDF只在本次hive會話中生效,可以部署為臨時函式,下面是具體的步驟;
- 將剛才建立的hiveudf-1.0-SNAPSHOT.jar檔案下載到hive伺服器,我這邊路徑是/home/hadoop/udf/hiveudf-1.0-SNAPSHOT.jar;
- 開啟hive會話,執行以下命令新增jar:
add jar /home/hadoop/udf/hiveudf-1.0-SNAPSHOT.jar;
- 執行以下命令建立名為udf_upper的臨時函式:
create temporary function udf_upper as 'com.bolingcavalry.hiveudf.udf.Upper';
- 找一個有資料並且有string欄位的表(我這是student表,其name欄位是string型別),執行以下命令:
select name, udf_upper(name) from student;
- 執行結果如下,紅框中可見udf_upper函式將name欄位轉為大寫:
- 這個UDF只在當前會話視窗生效,當您關閉了視窗此函式就不存在了;
- 如果您想在當前視窗將這個UDF清理掉,請依次執行以下兩個命令:
drop temporary function if exists udf_upper;
delete jar /home/hadoop/udf/hiveudf-1.0-SNAPSHOT.jar;
- 刪除後再使用udf_upper會報錯:
hive> select name, udf_upper(name) from student;
FAILED: SemanticException [Error 10011]: Line 1:13 Invalid function 'udf_upper'
部署和驗證(永久函式)
- 前面體驗了臨時函式,接下來試試如何讓這個UDF永久生效(並且對所有hive會話都生效);
- 在hdfs建立資料夾:
/home/hadoop/hadoop-2.7.7/bin/hadoop fs -mkdir /udflib
- 將jar檔案上傳到hdfs:
/home/hadoop/hadoop-2.7.7/bin/hadoop fs -put /home/hadoop/udf/hiveudf-1.0-SNAPSHOT.jar /udflib/
- 在hive會話視窗執行以下命令,使用hdfs中的jar檔案建立函式,要注意的是jar檔案地址是hdfs地址,一定不要漏掉hdfs:字首:
create function udf_upper as 'com.bolingcavalry.hiveudf.udf.Upper'
using jar 'hdfs:///udflib/hiveudf-1.0-SNAPSHOT.jar';
- 試一下這個UDF,如下圖,沒有問題:
6. 新開hive會話視窗嘗試上述sql,依舊沒有問題,證明UDF是永久生效的;
- 至此,我們們已經對hive的UDF的建立、部署、使用都有了基本瞭解,但是本篇的UDF太過簡單,只能用在一進一出的場景,接下來的文章我們們繼續學習多進一出和一進多出。
你不孤單,欣宸原創一路相伴
歡迎關注公眾號:程式設計師欣宸
微信搜尋「程式設計師欣宸」,我是欣宸,期待與您一同暢遊Java世界...
https://github.com/zq2599/blog_demos