• 三、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:

    注意,这里建表,指明了格式字段空格分隔,换行' '分隔

    CREATE TABLE users(id int, name string) ROW FORMAT DELIMITED FIELDS TERMINATED BY ' ' LINES TERMINATED BY '
    ' 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文档的格式是一致的

  • 相关阅读:
    [TJOI2015]棋盘
    [FJOI2017]矩阵填数——容斥
    [ZJOI2016]小星星
    [HEOI2013]SAO ——计数问题
    ZJOI2008 骑士
    莫队算法——暴力出奇迹
    可持久化线段树
    dij与prim算法
    LCA 最近公共祖先
    Linux 设置交换分区
  • 原文地址:https://www.cnblogs.com/lay2017/p/9973523.html
Copyright © 2020-2023  润新知