本文代碼碼雲地址:https://gitee.com/MaxBill/HSDPjava
在前文中咱們實踐了基於hadoop的數據倉庫hive的安裝、配置、應用、擴展等,那麼咱們在實際中該如何經過程序調用(用戶接口)開發呢,hive提供了三種調用方式:首先是CLI就是咱們前面使用過的hive shell命令行、而後就是經過JDBC或者ODBC的調用(經過程序可實現調用),最後就是官方提供的WebUI的方式。本文咱們詳細說的是使用JDBC經過java代碼去訪問hive服務,進行一些基本的操做。mysql
1.hadoop集羣git
2.hive元數據存儲服務(mysql服務)sql
3.hive數據倉庫服務shell
4.eclipse開發工具數據庫
1.建立一個空的java項目apache
2.建立如上的包eclipse
util包中使咱們操做的jdbc或者odbc的工具類工具
main包中使咱們程序運行的主類所在oop
3.啓動hadoop集羣
在主節點上啓動hadoop集羣start-all.sh
4.啓動元數據庫服務
登錄元數據庫服務所在主機,啓動mysql服務service mysql start
5.啓動hiveserver2服務
在hive機器上啓動hiveserver服務:hive --service hiveserver2 或者hive --service hiveserver2 &
6.啓動Hive Metastore服務
在hive機器上啓動Hive Metastore服務:hive --service metastore或者hive --service metastore &
看到以下信息,說明啓動完成:
7.驗證啓動
在終端輸入jps -ml查看:
能夠看到hadoop集羣個hive服務啓動都正常
1.編寫jdbc工具類
編寫打開hive鏈接的方法
代碼塊:
private static String driver = "org.apache.hive.jdbc.HiveDriver"; private static String url = "jdbc:hive2://hdpc01:10000/default"; private static String user = "root"; private static String pass = "123456"; // 打開鏈接 public static Connection openConnection() { Connection conn = null; try { Class.forName(driver); conn = DriverManager.getConnection(url, user, pass); } catch (Exception e) { e.printStackTrace(); } return conn; }
編寫關閉hive鏈接的方法
代碼塊:
// 關閉鏈接 public static void closeConnection(Statement stmt, Connection conn) { try { if (stmt != null) { stmt.close(); stmt = null; } if (conn != null) { conn.close(); conn = null; } System.out.println(">>>>>>>>>>>>>>>>>>>>:關閉鏈接成功..."); } catch (Exception e) { e.printStackTrace(); } }
測試鏈接
代碼塊:
package com.maxbill.hive.main; import java.sql.Connection; import java.sql.SQLException; import java.sql.Statement; import com.maxbill.hive.util.JdbcUtils; /** * @user maxbill * @date 2018/01/16 * @func hive操做測試類 */ public class HiveTest { public static void main(String[] args) { // 1.測試鏈接 testHiveConn(); } public static void testHiveConn() { try { Connection conn = JdbcUtils.openConnection(); Statement stmt = conn.createStatement(); if (null != stmt) { System.out.println(">>>>>>>>>>>>>>>>>>>>:打開鏈接成功..."); // 此處主要是測試鏈接是否正常,打開成功後,咱們調用關閉方法釋放鏈接 JdbcUtils.closeConnection(stmt, conn); } else { System.out.println(">>>>>>>>>>>>>>>>>>>>:打開鏈接失敗..."); } } catch (SQLException e) { e.printStackTrace(); } } }
執行測試鏈接的hive方法
發生異常,這是由於缺乏hive驅動包,咱們在項目中導入如下jar包即
而後繼續測試,鏈接成功
2.基本查詢操做
代碼塊:
public static void main(String[] args) { String sql = "select * from tb_user"; runQuerySql(sql); } // 查詢數據 public static void runQuerySql(String sql) { try { Connection conn = JdbcUtils.openConnection(); Statement stmt = conn.createStatement(); if (null != stmt) { System.out.println(">>>>>>>>>>>>>>>>>>>>:打開鏈接成功..."); ResultSet rs = stmt.executeQuery(sql); System.out.println(">>>>>>>>>>>>>>>>>>>>:執行運行結果..."); // 輸出查詢的結果集 List list = resultSetToList(rs); for (Object listObj : list) { System.err.println(listObj.toString()); } // 調用關閉方法釋放鏈接 JdbcUtils.closeConnection(stmt, conn); } else { System.out.println(">>>>>>>>>>>>>>>>>>>>:打開鏈接失敗..."); } } catch (SQLException e) { e.printStackTrace(); } } // ResultSet結果集轉成list public static List resultSetToList(ResultSet rs) throws java.sql.SQLException { if (rs == null) return Collections.EMPTY_LIST; ResultSetMetaData md = rs.getMetaData(); // 獲得結果集結構信息,好比字段數、字段名等 int columnCount = md.getColumnCount(); // ResultSet的列數 List list = new ArrayList(); Map rowData = new HashMap(); while (rs.next()) { rowData = new HashMap(columnCount); for (int i = 1; i <= columnCount; i++) { rowData.put(md.getColumnName(i), rs.getObject(i)); } list.add(rowData); } return list; }
下面的查詢操做都是基於以上方法,只需傳入sql語句參數,使用DML的查詢方法
1>.基本查詢
sql="SELECT * FROM tb_user WHERE id>0";
2>.查看錶結構
sql="desc tb_user";
3>.統計查詢
sql="SELECT COUNT(id) FROM tb_user ";
4>.表查詢
sql="show tables ";
如下的建立刪除表等操做沒有rs結果,使用DLL語句的處理方法
代碼塊:
// 數據操做 public static void runHandleSql(String sql) { try { Connection conn = JdbcUtils.openConnection(); Statement stmt = conn.createStatement(); if (null != stmt) { System.out.println(">>>>>>>>>>>>>>>>>>>>:打開鏈接成功..."); stmt.execute(sql); // 調用關閉方法釋放鏈接 JdbcUtils.closeConnection(stmt, conn); } else { System.out.println(">>>>>>>>>>>>>>>>>>>>:打開鏈接失敗..."); } } catch (SQLException e) { e.printStackTrace(); } }
5>.建立表
sql = "create table tb_test (key int, value string) row format delimited fields terminated by '\t'";
而後執行show tables 能夠看到建立的tb_test表
6>.刪除表
sql="drop table if exists tb_test";
而後執行show tables 能夠看到建立的tb_test表已經刪除
以上就是本文使用java代碼經過jdbc的方式鏈接hive進行的簡單的一些DLL查詢和DML查詢操做,在實際開發中相比以前的hive shell方式,使用代碼去操做的方式用的更多點。本文的測試代碼已經上傳碼雲,代碼地址爲:https://gitee.com/MaxBill/HSDP