hive學習筆記之九:基礎UDF

歡迎訪問我的GitHub

//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下載所有源碼,地址和鏈接資訊如下表所示:
名稱 鏈接 備註
項目主頁 //github.com/zq2599/blog_demos 該項目在GitHub上的主頁
git倉庫地址(https) //github.com/zq2599/blog_demos.git 該項目源碼的倉庫地址,https協議
git倉庫地址(ssh) [email protected]:zq2599/blog_demos.git 該項目源碼的倉庫地址,ssh協議
  1. 這個git項目中有多個文件夾,本章的應用在hiveudf文件夾下,如下圖紅框所示:

在這裡插入圖片描述

開發

  1. 新建名為hiveudf的maven工程,pom.xml內容如下,有兩處需要關注的地方,接下來馬上講到:
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="//maven.apache.org/POM/4.0.0"
         xmlns:xsi="//www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="//maven.apache.org/POM/4.0.0 //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世界…
//github.com/zq2599/blog_demos