1.建立一個普通Java工程java
2.導入hive安裝目錄下lib中全部以hive打頭的jar包sql
3.寫代碼實現一個ToUpper類數據庫
package com.jv.hive; import org.apache.hadoop.hive.ql.exec.UDF; public class MyToUpper extends UDF{ public String evaluate(String src) { return src.toUpperCase(); } }
4.導入jar包apache
5.上傳jar包到hive安裝目錄下的lib中服務器
1.添加jar函數
hive> add jar /home/hadoop/proc/apache-hive-1.2.2/lib/mytoupper.jar;oop
輸出:性能
2.註冊類測試
create temporary function mytoupper as 'com.jv.hive.MyToUpper';lua
輸出:
3.測試
select mytoupper(ename) from emp limit 10;
輸出:
重要:上面註冊的UDF函數是臨時的,若是退出hive客戶端,再進去就沒法使用mytoupper函數
Hive提供了永久註冊函數的方式:
create function park.mytoupper as 'com.jv.hive.MyToUpper' using jar 'hdfs://192.168.245.150:9000/user/hive/warehouse/udf/mytoupper.jar'
park是數據庫名
jar包須要放到hdfs中
全部客戶端鏈接上來均可以使用mytoupper函數
其餘數據庫要使用該函數能夠加park.mytoupper
建議不要弄太複雜的函數,若是效率低下會嚴重影響hive的性能,甚至把機器搞掛
1.在服務器上啓動hive service
./hive --service hiveserver2 &
2.在上面的工程中加入hadoop-common-2.7.1.jar包
3.編寫代碼
package com.jv.hive; import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.Statement; public class TestHiveJdbc { public static void main(String[] args) throws Exception { Class.forName("org.apache.hive.jdbc.HiveDriver"); Connection conn = DriverManager.getConnection("jdbc:hive2://192.168.245.150:10000/park","root","root"); Statement stat = conn.createStatement(); /* * 1.若是註冊UDF函數是臨時的,想要在代碼中使用UDF還需從新註冊 String sql = "add jar /home/hadoop/proc/apache-hive-1.2.2/lib/mytoupper.jar"; stat.execute(sql); sql = "create temporary function mytoupper as 'com.jv.hive.MyToUpper'"; stat.execute(sql); * 2.若是註冊UDF函數是永久的,則能夠直接使用UDF函數 */ ResultSet rs = null; rs = stat.executeQuery("select mytoupper(ename) ename from emp limit 10"); while(rs.next()) { System.out.println(rs.getString("ename")); } stat.close(); conn.close(); } }
只是爲了演示,因此異常處理都是直接throws