1. 程式人生 > >三、hive JavaAPI示例

三、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文件的格式是一致的