HIVE的UDF以及JDBC編程

HIVE的UDF以及JDBC編程

1、UDF

    UDF是用來對HIVE函數庫進行擴展的,能夠利用java代碼進行自定義的功能需求。java

一、步驟

    1.新建java工程。linux

    2.導入HIVE相關包,jar包在HIVE安裝程序的lib目錄下,只須要拷貝jar包便可。sql

    3.建立類繼承UDF類。org.apache.hadoop.hive.ql.exec.UDFshell

    4.本身編寫一個名爲evaluate方法,返回值和參數任意,可是方法名字必須是evaluate數據庫

    5.將寫好的類打成jar包,在打jar包的時候能夠只打本身寫的類,jar包資源能夠不打進jar包裏。而後上傳到linux中。apache

    6.在hive命令行下,向hive註冊UDF,並建立當前函數(如何註冊和建立在下面介紹)。編程

    完成以上步驟以後就能夠在hql中使用該自定義函數了。bash

案例

    編寫一個簡單的小寫轉大寫。服務器

import org.apache.hadoop.hive.ql.exec.UDF;
public class MyUDFDemo extends UDF{
	public String evaluate(String str) {
		return str.toUpperCase();
	}
}

二、註冊函數

在向Hive註冊函數的時候,分爲臨時註冊和永久註冊。函數

1.臨時註冊

註冊臨時函數比較簡單,只要在hive的shell界面輸入如下兩條命令,便可註冊,可是此函數會在你退出當前Hive的shell時,自動去掉。

#註冊臨時函數
hive> add jar /xxx/xxx/xxx.jar;
#命名臨時函數
hive> create temporary function function_name as "xx.xx.xx.classname";

以上兩部就能夠生成一個自定義的函數了。切記,這個是臨時的,適合測試使用,不適合生產環境。

示例

[root@xh01 horseman]# ls
HorseMan.jar
[root@xh01 horseman]# pwd
/home/script/horseman

以上是本人的jar包以及存放位置,jar包中有一個類,類的全路徑名爲:cn.com.xh.udf.OnWork.class。

如下是登陸Hive的shell進行臨時添加的操做:

[root@xh01 horseman]# hive
#省略系統輸出
#…………
hive> add jar /home/script/horseman/HorseMan.jar;
Added [/home/script/horseman/HorseMan.jar] to class path
Added resources: [/home/script/horseman/HorseMan.jar]
hive> create temporary function on_work as "cn.com.xh.udf.OnWork";
OK
Time taken: 0.007 seconds
hive> select on_work();

如上,成功添加了一個名爲on_work的方法。

2.永久註冊

註冊永久函數,統計網上的說法,有兩種,其一修改源碼,其二就是本人接下來要說的一種。

第一種比較危險,由於一個弄很差,就會形成Hive崩盤,並且不適合生產環境,咱們添加函數,都是在業務發展的過程當中添加的,不會說從新去搭建一個Hive來專門弄一個函數。

第二種添加的方法和臨時的區別不大,可是適合咱們在生產環境使用。

如下是官方給出的說明:

在Hive 0.13或更高版本中,函數能夠註冊到Metastore,所以能夠在查詢中引用它們,而無需在每一個會話中建立臨時函數。

建立功能

hive> CREATE FUNCTION [db_name.]function_name AS class_name [USING JAR|FILE|ARCHIVE 'file_uri' [, JAR|FILE|ARCHIVE 'file_uri'] ];

此語句容許您建立由class_name實現的函數。可使用USING子句指定須要添加到環境中的jar,文件或存檔;當Hive會話第一次引用該函數時,這些資源將被添加到環境中,就像發佈了ADD JAR / FILE同樣。若是Hive不在本地模式,則資源位置必須是非本地URI,例如HDFS位置。

該函數將添加到指定的數據庫,或者在建立函數時添加到當前數據庫。能夠經過徹底限定函數名稱(db_name.function_name)來引用該函數,或者若是函數位於當前數據庫中,則能夠無限制地引用該函數。

刪除功能

hive>DROP FUNCTION [IF EXISTS] function_name;

若是函數不存在,DROP將返回錯誤,除非指定了IF EXISTS或配置變量hive.exec.drop.ignorenonexistent  設置爲true。

注意:刪除函數時,必定要處於添加函數的數據庫中。

從新加載功能

hive> RELOAD FUNCTION;

從HIVE-2573開始,若是在建立函數以前啓動了HiveServer2或其餘Hive CLI會話,則在一個Hive CLI會話中建立永久功能可能不會反映出來。在HiveServer2或HiveCLI會話中發出RELOAD FUNCTION將容許它獲取可能由不一樣HiveCLI會話完成的永久功能的任何更改。

查看官方原文請點擊此處

示例

本人將臨時方法註冊的jar包拿過來,存放到HDFS中的/udf/horseman/目錄中,添加方法以下:

hive>create function on_work as 'cn.com.xh.udf.OnWork' using jar 'hdfs://xh01:9000/udf/horseman/HorseMan.jar';

這個只須要這一條語句,便可建立永久的函數。以下是刪除函數:

hive>drop function on_work;

2、JDBC編程

一、介紹

    hive實現了jdbc接口,因此能夠很是方便用jdbc技術經過java代碼操做。

二、步驟

1.開啓對外服務

    HIVE默認狀況是關閉對外的服務,須要在服務器端開啓HiveServer2服務,命令以下:

./hive --service hiveserver2

    這個模式一直開啓的狀況下,才能鏈接成功,不然,鏈接失敗。

    可使用一下命令,是該服務進入後臺運行:

[root@hadoop bin]# ./hive --service hiveserver2 &
[1] 6669
[root@hadoop bin]# bg 1
-bash: bg: job 1 already in background

    這樣程序進入後臺運行,也不影響進行其餘操做。

2.java工程

1>建立工程

    建立本地java工程。

2>導入jar包

    導入hive\lib目錄下的hive-jdbc-1.2.0-standalone.jar

    導入hadoop-2.7.1\share\hadoop\common下的hadoop-common-2.7.1.jar

3>編寫jdbc代碼

public static void main(String[] args) {
		Connection conn = null;
		Statement st = null;
		ResultSet rs = null;
		try {
			// 1.註冊數據庫驅動
			Class.forName("org.apache.hive.jdbc.HiveDriver");
			// 2.獲取數據鏈接
			conn = DriverManager.getConnection("jdbc:hive2://192.168.75.150:10000/park", "root", "root");
			// 3.獲取傳輸器對象
			st = conn.createStatement();
			// 4.傳輸sql執行獲取結果集
			rs = st.executeQuery("select * from stu");
			// 5.處理結果集
			while (rs.next()) {
				String str = rs.getString("name");
				System.out.println(str);
			}
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			// 6.關閉鏈接
			if (rs != null) {
				try {
					rs.close();
				} catch (Exception e) {
					e.printStackTrace();
				} finally {
					rs = null;
				}
			}
			if (st != null) {
				try {
					st.close();
				} catch (Exception e) {
					e.printStackTrace();
				} finally {
					st = null;
				}
			}
			if (conn != null) {
				try {
					conn.close();
				} catch (Exception e) {
					e.printStackTrace();
				} finally {
					conn = null;
				}
			}
		}
	}

    以上須要注意的是jdbc的驅動以及鏈接地址協議。

上一篇:HIVE內置函數

下一篇:Hive應用:外部表連接內部表

相關文章
相關標籤/搜索