場景
在當前項目中,因為之前使用數據庫查詢,而隨着數據的增多,查詢速度會越來越慢,所以需要使用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