在大數據分析中,Hive作爲歷史數據挖掘分析工具,用到的很多,我們可以通過Hive的命令行來很方便地操作Hive中的數據,但是很多時候我們都需要將Hive的操作融入到編程環境中去,而Hive提供了JDBC接口,因而我們可以很方便地通過JDBC來操作Hive。下面就記錄一下通過JDBC來連接Hive的過程:
第一步:啓動集羣中的Mysql服務(在安裝mysql的那個節點上)
service mysqld start
第二步:啓動Hived的Thrift服務(在安裝Hive的那個節點上)
hive --service hiveserver2 &
第三步:通過JDBC來連接HIve(代碼如下)
//連接JDBC的主代碼
package com.shuke.Hive;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
public class test {
public static void main(String[] args) throws SQLException {
Connection connection = null;
PreparedStatement pst = null;
ResultSet result = null;
//建立連接
connection = ConnectionHive.getConnection(ConnectionHive.url, "", "");
//執行SQL語句
String querysql = "select * from a66 where DEVIDSTR = ?";
try {
pst = connection.prepareStatement(querysql);
pst.setString(1, "550001411993");
Long stime = System.currentTimeMillis();
result = pst.executeQuery();
System.out.println("time---"+(System.currentTimeMillis()-stime)+"ms");
} catch (SQLException e) {
e.printStackTrace();
}
//處理查詢結果
while (result.next()) {
System.out.println(result.getString("DEVIDSTR"));
}
//釋放資源
ConnectionHive.close(connection, pst, result);
}
}
封裝的JDBC的Connection方法
package com.shuke.Hive;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
public class ConnectionHive {
public static String url = "jdbc:hive2://192.168.8.119:10000/default";
//無參構造函數
private ConnectionHive(){
}
//將驅動註冊寫入靜態代碼塊中,這樣保證了驅動註冊在程序中只運行一次
static{
try {
Class.forName("org.apache.hive.jdbc.HiveDriver");
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
//數據庫連接的靜態方法
public static Connection getConnection(String url,String user,String password){
Connection conn = null;
try {
conn = DriverManager.getConnection(url, user, password);
} catch (SQLException e) {
System.out.println("連接到Hive失敗!");
e.printStackTrace();
} finally{
return conn;
}
}
/* 釋放資源的靜態方法:
* 每釋放一個資源都要try catch,在finally中寫釋放下一個資源的代碼
* 這樣保證了在任何一個資源釋放出現異常時,其他資源還都能正常釋放,
* 不至於因爲異常而造成程序退出,從而其他資源沒有成功釋放
* */
public static void close(Connection conn,Statement stmt,ResultSet result){
try {
if (result != null)
result.close();
} catch (SQLException e) {
e.printStackTrace();
} finally{
try {
if (stmt!=null)
stmt.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally{
try {
if(conn!=null)
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
}