自己寫UDF函式匯入hive對查詢結果進行格式化顯示(Java)
阿新 • • 發佈:2018-12-23
本篇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';