標籤:ams 技術分享 word param rownum 遠端連線 .exe ges resource
前兩天,由於系統的架構設計的原因,想通過Java直接存取Hive資料庫,對於我這個Java以及Hadoop平台的菜鳥來說,的確是困難重重,不過,還好是搞定了。感覺也不是很麻煩。這篇文章,作為一個感想記錄下來。( yangyang8848)
一、Hive的訪問方式
一般情況下,Hive是不能直接Java串連並訪問的,後來出現來一個SparkSQL的東東,變得可以通過JDBC的方式訪問串連。首先,我先介紹一些從Linux下訪問的方法:
1、遠程登入到Linux平台:
2、進入到hive資料庫中,我們執行一條查詢語句:
通過可以看到,系統執行了Map/Reduce操作,並最後顯示相關的結果。
這裡有一個乾貨哦:Hive查詢語句不支援類似於Mysql中的分頁查詢的,因此,這裡採用了另外一種辦法進行分頁,自己看圖片學習啦~!
3、下邊我們採用Beeline遠端連線SqarkSQL然後訪問Hive資料。
通過上邊頁面可以看到,系統可以正確將資料查詢出來。
二、使用Java代碼進行串連訪問。
如果想要通過Java進行訪問,首先要在引用一下三個Jar包:
<dependency> <groupId>org.apache.hive</groupId> <artifactId>hive-jdbc</artifactId> <version>1.2.1</version> </dependency> <dependency> <groupId>org.apache.hadoop</groupId> <artifactId>hadoop-common</artifactId> <version>2.4.1</version> </dependency> <dependency> <groupId>jdk.tools</groupId> <artifactId>jdk.tools</artifactId> <version>1.6</version> <scope>system</scope> <systemPath>${JAVA_HOME}/lib/tools.jar</systemPath> </dependency>
需要注意的是,包的版本一定要確認好,切勿版本過高
如果發生以下錯誤:
org.apache.thrift.TApplicationException: Required field ‘client_protocol‘ is unset! Struct:TOpenSessionReq(client_protocol:null)
則極可能的原因是你項目的hive-jdbc版本和伺服器不一致的原因造成的,替換成和伺服器一致的版本就可以了,
以下存取碼都已經經過了測試,拿走直接用,哈哈:
public static int hiveJDBC_RowCount(String sql,Map<Integer,String> params){try {ResourceBundle rb = ResourceBundle.getBundle("config"); Class.forName(rb.getString("hivedriverClassName")).newInstance();Connection conn = DriverManager.getConnection(rb.getString("hiveurl"),rb.getString("hiveusername"),rb.getString("hivepassword"));java.sql.PreparedStatement pstsm = conn.prepareStatement(sql);for(Integer key : params.keySet()){pstsm.setString(key, params.get(key));}ResultSet resultSet = pstsm.executeQuery();int rowNum = 0;if(resultSet.next()){rowNum = resultSet.getInt(1);}return rowNum; } catch (Exception e) {System.out.println(e);return 0;}}
hivedriverClassName=org.apache.hive.jdbc.HiveDriverhiveurl=jdbc:hive2://192.168.31.243:10000/defaulthiveusername=roothivepassword=
Java採用JDBC的方式串連Hive(SparkSQL)