前兩天,因爲系統的架構設計的緣由,想經過Java直接訪問Hive數據庫,對於我這個Java以及Hadoop平臺的菜鳥來講,的確是困難重重,不過,還好是搞定了。感受也不是很麻煩。這篇文章,做爲一個感想記錄下來。( 做者:yangyang8848)css
1、Hive的訪問方式java
通常狀況下,Hive是不能直接Java鏈接並訪問的,後來出現來一個SparkSQL的東東,變得能夠經過JDBC的方式訪問鏈接。首先,我先介紹一些從Linux下訪問的方法:sql
一、遠程登陸到Linux平臺:數據庫
二、進入到hive數據庫中,咱們執行一條查詢語句:apache
經過上圖能夠看到,系統執行了Map/Reduce操做,並最後顯示相關的結果。服務器
這裏有一個乾貨哦:Hive查詢語句不支持相似於Mysql中的分頁查詢的,所以,這裏採用了另一種辦法進行分頁,本身看圖片學習啦~!架構
三、下邊咱們採用Beeline遠程鏈接SqarkSQL而後訪問Hive數據。oop
經過上邊頁面能夠看到,系統能夠正確將數據查詢出來。學習
2、使用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.HiveDriver hiveurl=jdbc:hive2://192.168.31.243:10000/default hiveusername=root hivepassword=