三、hive JavaAPI示例
在上文中https://www.cnblogs.com/lay2017/p/9973370.html
我們通過hive shell去操作hive,本文我們以Java程式碼的示例去對hive執行載入資料和查詢資料來演示JavaAPI如何通過JDBC來操作hive的
hive client的更多內容可以參考:https://cwiki.apache.org/confluence/display/Hive/HiveClient
一、依賴
由於hive的服務端基於1.2.2版本,所以這裡採用jdbc1.2.2,否則你可能報一些奇怪的錯誤(下載依賴需要一點時間)
<dependency> <groupId>org.apache.hadoop</groupId> <artifactId>hadoop-common</artifactId> <version>2.6.5</version> </dependency> <dependency> <groupId>org.apache.hive</groupId> <artifactId>hive-jdbc</artifactId> <version>1.2.2</version> </dependency>
二、準備
我們在/tmp目錄下新建一個user.txt,內容如下:
1 lay 2 marry 3 gary
然後我們啟動hdfs,進入hive安裝目錄:/usr/local/hadoop/hive/apache-hive-1.2.2-bin,啟動Hive shell,在test資料庫裡面新建一張表t_user:
注意,這裡建表,指明瞭格式欄位空格分隔,換行'\n'分隔
CREATE TABLE users(id int, name string) ROW FORMAT DELIMITED FIELDS TERMINATED BY ' ' LINES TERMINATED BY '\n' STORED AS TEXTFILE;
完畢以後,我們關閉Hive shell,如果你採用derby內建資料庫,但是不關閉hive你無法再啟動另外一個
我們在hive安裝目錄,啟動hiveserver2,執行命令
hiveserver2
然後你會看到介面被卡住了,其實hive server已經在運行了,如果你開啟另一個Linux客戶端,你會看到一個runjar的程式在執行
以上,我們啟動hiveserver2,準備好了服務端的資料
三、JDBC操作
下面,我們使用jdbc進行操作,程式碼如下:
hive預設埠是10000,如果你沒有配置,並沒有通過啟動指定的話,預設就是10000;
這裡的master是配置過的hostname和ip的對映,如果你直接使用Ip也行。如果你希望配置,可以參考:https://www.cnblogs.com/lay2017/p/9953371.html
驅動採用org.apache.hive.jdbc.HiveDriver,如果你採用org.apache.hadoop.hive.jdbc.HiveDriver會報classNotFound因為,不同版本要求的驅動是不同的,本文基於1.2.2版本,所以要求前者
URL地址採用jdbc:hive2:...而不是jdbc:hive...這是因為我們採用Hiveserver2啟動不是hiveserver,如果URL不匹配那麼是拿不到connection的
import java.sql.*; public class HiveJdbcDemo { private static String DRIVER = "org.apache.hive.jdbc.HiveDriver"; private static String URL = "jdbc:hive2://master:10000/test"; private static String USERNAME = ""; private static String PASSWORD = ""; private static Connection connection; private static Statement statement; static { try { // 載入hive jdbc驅動 Class.forName(DRIVER); // 獲取連線 connection = DriverManager.getConnection(URL, USERNAME, PASSWORD); // 獲取statement statement = connection.createStatement(); } catch (Exception e) { e.printStackTrace(); } } public static void main(String[] args) throws SQLException { insert(); select(); } public static void insert() throws SQLException { String sql = "load data local inpath '/tmp/user.txt' overwrite into table t_user "; statement.execute(sql); } public static void select() throws SQLException { String sql = "select * from t_user"; ResultSet resultSet = statement.executeQuery(sql); while (resultSet.next()) { System.out.println(resultSet.getLong("id"));; System.out.println(resultSet.getString("name"));; } } }
這裡的簡單程式碼示例,我們連線了test資料庫,然後將/tmp/user.txt文字載入到了資料庫中,並通過select語句簡單將結果查詢了出倆,輸出如下:
請注意:如果你輸出的都是null,那麼可能是因為你在建表的時候沒有指明格式,所以載入資料的時候無法按照格式載入進入資料,所以查詢自然也就查詢出了null。
所以,請確保create table的時候指定的格式,與你的txt文件的格式是一致的。