1. 程式人生 > >自己寫UDF函式匯入hive對查詢結果進行格式化顯示(Java)

自己寫UDF函式匯入hive對查詢結果進行格式化顯示(Java)

本篇UDF函式使用IntelliJ IDEA進行編寫和打包,使用的是Java語言,資料使用上一篇部落格“HDFS、Hive(Impala)讀取本地檔案到HDFS,再使用Hive(Impala)從HDFS讀取檔案進行建表”中已經放入hive中的資料進行查詢展示。

建立一個maven專案,匯入依賴包

<!-- 根據Linux系統上安裝的的hadoop和hive版本,設定版本引數,不一定和我的一樣 -->
<!-- hadoop版本查詢 $ hadoop version -->
<!-- hive版本查詢需要進入安裝目錄進行檢視,我這裡的安裝目錄是/usr/lib/hive,安裝目錄下的lib資料夾下有一個hive-common-1.1.0-cdh5.4.3.jar, 1.1.0-cdh5.4.3 即為hive版本號 -->
    <properties>
        <hadoop.version>2.6.0-cdh5.4.3</hadoop.version>
        <hive.version>1.1.0-cdh5.4.3</hive.version>
    </properties>
    <repositories>
        <repository>
            <id>cloudera</id>
            <url>http://repository.cloudera.com/artifactory/cloudera-repos</url>
        </repository>
    </repositories>
    <dependencies>
        <!-- 新增依賴元件,根據上方配置的版本引數和repository知識庫下載依賴 -->
        <dependency>
            <groupId>org.apache.hadoop</groupId>
            <artifactId>hadoop-common</artifactId>
            <version>${hadoop.version}</version>
        </dependency>
        <dependency>
            <groupId>org.apache.hive</groupId>
            <artifactId>hive-exec</artifactId>
            <version>${hive.version}</version>
        </dependency>
        <!-- junit是java的單元測試框架 -->
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.10</version>
            <scope>test</scope>
        </dependency>
    </dependencies>

編寫class,UDF_Time.java(儘量和我寫得一樣,不然很可能無法實現)

package com.cheen;
import org.apache.hadoop.hive.ql.exec.UDF;
import org.apache.hadoop.io.Text;
public class UDF_Time extends UDF {

    public Text evaluate (Text t) {
        if (t == null) return null;
        if (Double.parseDouble(String.valueOf(t)) > 8){
            return new Text("高");
        } else {
            return new Text("低");
        }

    }
    public static void main(String [] args){
        System.out.println(new UDF_Time().evaluate(new Text("8.5")));
    }
}

完成後進行打包,點選IDEA的選單欄上面的View->Tool Windows->Maven Projects進行開啟工具右側的Maven Projects欄,在右側欄中展開 專案名->Lifecycle->package,郵件點選package,選擇第一個選項“Run Maven Build”,工具就會自動進行打包,打包完成後會在地下出現打包完成的jar包存放位置,進入該目錄找到該jar包,上傳到你Linux系統中。

上傳到Linux中(將這個包放到hadoop安裝目錄下的lib裡面,方便管理),我這裡的安裝目錄是/usr/lib/hadoop/lib/,上面的hive-1.0-SNAPSHOT.jar檔案就放到這裡。

啟動hive。

$ hive

將上傳的jar包匯入到classpath變數裡

hive> add jar /usr/lib/hadoop/lib/hive-1.0-SNAPSHOT.jar;

檢視已經匯入的jar包

hive> list jars;

建立一個臨時函式,關聯該jar包

hive> create temporary function time_all as 'com.cheen.UDF_Time';

檢視建立的函式

hive> show functions like 'time*';

使用該函式進行查詢

hive> select name,time_all(sum(hours)),avg(hours),count(hours) from trainingrecord group by name;

查詢結果

至此已經完成了UDF函式的建立和使用。

補充一個hive中建立永久性函式的命令,建立一個cheen庫的永久函式time_all

hive> create function cheen.time_all as 'com.cheen.UDF_Time';