hive學習筆記之九:基礎UDF

markriver發表於2021-09-09

歡迎訪問我的GitHub

https://github.com/zq2599/blog_demos

內容:所有原創文章分類彙總及配套原始碼,涉及Java、Docker、Kubernetes、DevOPS等;

《hive學習筆記》系列導航

  1. 基本資料型別
  2. 複雜資料型別
  3. 內部表和外部表
  4. 分割槽表
  5. 分桶
  6. HiveQL基礎
  7. 內建函式
  8. Sqoop
  9. 基礎UDF
  10. 使用者自定義聚合函式(UDAF)
  11. UDTF

本篇概覽

  • 本文是《hive學習筆記》的第九篇,前面學習的內建函式儘管已經很豐富,但未必能滿足各種場景下的個性化需求,此時可以開發使用者自定義函式(User Defined Function,UDF),按照個性化需求自行擴充套件;
  • 本篇內容就是開發一個UDF,名為udf_upper,功能是將字串欄位轉為全大寫,然後在hive中使用這個UDF,效果如下圖紅框所示:

在這裡插入圖片描述

  • 本篇有以下章節:
  1. 開發
  2. 部署和驗證(臨時函式)
  3. 部署和驗證(永久函式)

原始碼下載

  1. 如果您不想編碼,可以在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協議
  1. 這個git專案中有多個資料夾,本章的應用在hiveudf資料夾下,如下圖紅框所示:

在這裡插入圖片描述

開發

  1. 新建名為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>
  1. 上述pom.xml中,兩個依賴的scopeprovided,因為這個maven工程最終只需要將我們們寫的java檔案構建成jar,所以依賴的庫都不需要;
  2. 上述pom.xml中排除了pentaho-aggdesigner-algorithm,是因為從maven倉庫下載不到這個庫,為了能快速編譯我的java程式碼,這種排除的方式是最簡單的,畢竟我用不上(另一種方法是手動下載此jar,再用maven install命令部署在本地);
  3. 建立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();
    }
}
  1. 編碼已完成,執行mvn clean package -U編譯構建,在target目錄下得到hiveudf-1.0-SNAPSHOT.jar檔案;
  2. 接下來將我們們做好的UDF部署在hive,驗證功能是否正常;

部署和驗證(臨時函式)

  1. 如果希望UDF只在本次hive會話中生效,可以部署為臨時函式,下面是具體的步驟;
  2. 將剛才建立的hiveudf-1.0-SNAPSHOT.jar檔案下載到hive伺服器,我這邊路徑是/home/hadoop/udf/hiveudf-1.0-SNAPSHOT.jar
  3. 開啟hive會話,執行以下命令新增jar:
add jar /home/hadoop/udf/hiveudf-1.0-SNAPSHOT.jar;
  1. 執行以下命令建立名為udf_upper的臨時函式:
create temporary function udf_upper as 'com.bolingcavalry.hiveudf.udf.Upper';
  1. 找一個有資料並且有string欄位的表(我這是student表,其name欄位是string型別),執行以下命令:
select name, udf_upper(name) from student;
  1. 執行結果如下,紅框中可見udf_upper函式將name欄位轉為大寫:

在這裡插入圖片描述

  1. 這個UDF只在當前會話視窗生效,當您關閉了視窗此函式就不存在了;
  2. 如果您想在當前視窗將這個UDF清理掉,請依次執行以下兩個命令:
drop temporary function if exists udf_upper;
delete jar /home/hadoop/udf/hiveudf-1.0-SNAPSHOT.jar;
  1. 刪除後再使用udf_upper會報錯:
hive> select name, udf_upper(name) from student;
FAILED: SemanticException [Error 10011]: Line 1:13 Invalid function 'udf_upper'

部署和驗證(永久函式)

  1. 前面體驗了臨時函式,接下來試試如何讓這個UDF永久生效(並且對所有hive會話都生效);
  2. 在hdfs建立資料夾:
/home/hadoop/hadoop-2.7.7/bin/hadoop fs -mkdir /udflib
  1. 將jar檔案上傳到hdfs:
/home/hadoop/hadoop-2.7.7/bin/hadoop fs -put /home/hadoop/udf/hiveudf-1.0-SNAPSHOT.jar /udflib/
  1. 在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';
  1. 試一下這個UDF,如下圖,沒有問題:

在這裡插入圖片描述
6. 新開hive會話視窗嘗試上述sql,依舊沒有問題,證明UDF是永久生效的;

  • 至此,我們們已經對hive的UDF的建立、部署、使用都有了基本瞭解,但是本篇的UDF太過簡單,只能用在一進一出的場景,接下來的文章我們們繼續學習多進一出和一進多出。

你不孤單,欣宸原創一路相伴

  1. Java系列
  2. Spring系列
  3. Docker系列
  4. kubernetes系列
  5. 資料庫+中介軟體系列
  6. DevOps系列

歡迎關注公眾號:程式設計師欣宸

微信搜尋「程式設計師欣宸」,我是欣宸,期待與您一同暢遊Java世界...
https://github.com/zq2599/blog_demos

相關文章