Hive自定義函數與JDBC鏈接

自定義函數

編寫代碼

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的性能,甚至把機器搞掛

jdbc訪問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

相關文章
相關標籤/搜索