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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM