• Hive学习系列:maven+springboot+CDH环境下,连接Hive进行操作


    场景
    在当前项目中,因为之前使用数据库查询,而随着数据的增多,查询速度会越来越慢,所以需要使用Java来调用hive进行数据统计。本篇博文主要是使用springboot+hive来查询hive数据,并返回查询的数据结果。

    环境
    软件 版本
    springboot 2.1.8.RELEASE
    CDH 5.15.1
    Hive 1.1.0
    正文
    确定Hive版本
    登录服务器控制台,我们可以使用命令:

    hive --version 
    来查询hive的具体版本,如下图:


    新建项目,并引入hive-jdbc依赖
    新建springboot项目,并引入hive-jdbc依赖。目前在maven hive-jdbc仓库中,最新的版本是3.1.2。但是因为我们这里的环境版本是1.1.0,所以要选择1.1.0版本,不然就会代码运行的时候,就会报错。pom.xml引入依赖如下:

    <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.1.0</version>
    </dependency> 
    一般引入这个依赖就足够了,在本文的样例代码中,跑起来是没有问题的。

    demo示例
    因为是demo示例,所以这里屏蔽了环境变量取参等可扩展部分,使用一个main方法来调用我们的hive查询相关的方法。demo代码如下:

    @SpringBootApplication
    @Slf4j
    public class AnalysisApp implements CommandLineRunner {
    private static String driverName = "org.apache.hive.jdbc.HiveDriver";
    public static void main(String[] args) {
    SpringApplication.run(AnalysisApp.class, args);
    }

    @Override
    public void run(String... args) throws Exception {
    try {
    Class.forName(driverName);
    } catch (ClassNotFoundException e) {
    e.printStackTrace();
    System.exit(1);
    }
    Connection con = DriverManager.getConnection("jdbc:hive2://datanode02:10000/test", "hive", "");
    Statement stmt = con.createStatement();
    String tableName = "testHiveDriverTable";
    log.info("删除表");
    stmt.execute("drop table if exists " + tableName);
    stmt.execute("create table " + tableName + " (key int, value string)");
    // show tables
    String sql = "show tables '" + tableName + "'";
    log.info("Running: " + sql);
    ResultSet res = stmt.executeQuery(sql);
    if (res.next()) {
    log.info(res.getString(1));
    }
    // describe table
    sql = "describe " + tableName;
    log.info("Running: " + sql);
    res = stmt.executeQuery(sql);
    while (res.next()) {
    log.info(res.getString(1) + "\t" + res.getString(2));
    }

    // select * query
    sql = "select * from " + tableName;
    log.info("Running: " + sql);
    res = stmt.executeQuery(sql);
    while (res.next()) {
    log.info(String.valueOf(res.getInt(1)) + "\t" + res.getString(2));
    }

    // regular hive query
    sql = "select count(1) from " + tableName;
    log.info("Running: " + sql);
    res = stmt.executeQuery(sql);
    while (res.next()) {
    log.info(res.getString(1));
    }
    }

    在官网Apache Hive HiveClient提供的demo,里面引用的驱动类和我本文的驱动类是不同的,这个是因为引用的jar包是不同的,所以才存在差异。所以,如果运行报错,提示驱动类不存在,则需要到自己引用的jar包里面看看使用的驱动类具体路径是什么。

    结果
    把代码复制到自己的项目中,执行之后,控制台结果如下:

    2020-06-08 13:45:01.457 INFO 4540 --- [ main] c.c.y.b.precision.analysis.AnalysisApp : Started AnalysisApp in 24.643 seconds (JVM running for 38.374)
    2020-06-08 13:45:01.494 INFO 4540 --- [ main] org.apache.hive.jdbc.Utils : Supplied authorities: datanode02:10000
    2020-06-08 13:45:01.495 INFO 4540 --- [ main] org.apache.hive.jdbc.Utils : Resolved authority: datanode02:10000
    2020-06-08 13:45:01.620 INFO 4540 --- [ main] org.apache.hive.jdbc.HiveConnection : Will try to open client transport with JDBC Uri: jdbc:hive2://datanode02:10000/test
    2020-06-08 13:45:01.966 INFO 4540 --- [ main] c.c.y.b.precision.analysis.AnalysisApp : 删除表
    2020-06-08 13:45:02.764 INFO 4540 --- [ main] c.c.y.b.precision.analysis.AnalysisApp : Running: show tables 'testHiveDriverTable'
    2020-06-08 13:45:03.153 INFO 4540 --- [ main] c.c.y.b.precision.analysis.AnalysisApp : testhivedrivertable
    2020-06-08 13:45:03.153 INFO 4540 --- [ main] c.c.y.b.precision.analysis.AnalysisApp : Running: describe testHiveDriverTable
    2020-06-08 13:45:03.418 INFO 4540 --- [ main] c.c.y.b.precision.analysis.AnalysisApp : key int
    2020-06-08 13:45:03.418 INFO 4540 --- [ main] c.c.y.b.precision.analysis.AnalysisApp : value string
    2020-06-08 13:45:03.419 INFO 4540 --- [ main] c.c.y.b.precision.analysis.AnalysisApp : Running: select * from testHiveDriverTable
    2020-06-08 13:45:03.723 INFO 4540 --- [ main] c.c.y.b.precision.analysis.AnalysisApp : Running: select count(1) from testHiveDriverTable
    2020-06-08 13:45:26.323 INFO 4540 --- [ main] c.c.y.b.precision.analysis.AnalysisApp : 0 
    总结
    遇到一个新的需求,最好到官网去看看示例。如果不够详细,也可以搜索一下对应的博客。两者结合,一般可以解决很多问题了。


    ————————————————
    版权声明:本文为CSDN博主「枫夜求索阁」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
    原文链接:https://blog.csdn.net/u013084266/article/details/106571048

  • 相关阅读:
    您认为在测试人员同开发人员的沟通过程中,如何提高沟通的效率和改善沟通的效果?维持测试人员同开发团队中其他成员良好的人际关系的关键是什么?
    redis和jedis的用法,区别
    Jedis实现多种功能总结
    Druid简单介绍
    Svn与Git的区别
    SVN的一些基本概念(学前了解)
    Redis-cli 的功能
    postman的使用方法
    Spring Boot 有哪些优点?
    Redis中的常用命令哪些?
  • 原文地址:https://www.cnblogs.com/javalinux/p/14825285.html
Copyright © 2020-2023  润新知