IntelliJ中通过sbt引入依赖实现Scala连接Hive数据库的问题求助
问题解决方案
1. sbt依赖引入方案
完全可以通过sbt添加依赖的方式解决jar包导入问题,无需手动往项目结构中上传jar包。注意依赖版本必须和你Ubuntu服务器上部署的Hive、Hadoop大版本完全匹配,否则会出现类不兼容、连接异常等问题。
以下是Hive 2.3.x + Hadoop 2.7.x版本的参考依赖配置,你可以根据自己服务器的实际版本修改版本号:
libraryDependencies ++= Seq( "org.apache.hive" % "hive-jdbc" % "2.3.9", "org.apache.hadoop" % "hadoop-common" % "2.7.7" )
如果sbt拉取依赖速度慢,可以在sbt配置中添加国内镜像源加速。
2. 现有代码问题修正
你当前的测试代码存在两处核心错误:
- 驱动类路径错误:Hive 2.x及以上版本的JDBC驱动类为
org.apache.hive.jdbc.HiveDriver,你使用的是Hive 1.x的旧路径 - JDBC URL格式错误:无需添加http前缀,正确格式为
jdbc:hive2://服务器IP:10000/数据库名
修正后的完整可运行代码如下:
import java.sql.{Connection, DriverManager, ResultSet, Statement} object HiveJdbcClient extends App { val driverName = "org.apache.hive.jdbc.HiveDriver" Class.forName(driverName) // 若Hive配置了用户名密码,直接填入第二、第三个参数即可 val con = DriverManager.getConnection("jdbc:hive2://192.168.43.64:10000/default", "", "") val stmt = con.createStatement() val tableName = "testHiveDriverTable" // DDL操作建议使用execute方法而非executeQuery stmt.execute(s"drop table if exists $tableName") stmt.execute(s"create table $tableName (key int, value string)") // 全表查询测试 var sql = s"select * from $tableName" var res = stmt.executeQuery(sql) while (res.next()) { println(s"${res.getInt(1)}\t${res.getString(2)}") } // 聚合查询测试 sql = s"select count(1) from $tableName" res = stmt.executeQuery(sql) while (res.next()) { println(res.getString(1)) } // 关闭资源避免连接泄漏 res.close() stmt.close() con.close() }
3. 服务器端前置检查
运行代码前请确认Ubuntu服务器上的配置符合要求:
- HiveServer2服务已启动:执行
ps -ef | grep HiveServer2确认进程存在,若未启动则执行hive --service hiveserver2 &启动服务 - 10000端口对外开放:检查防火墙规则,开放10000端口或临时关闭防火墙进行测试
- 远程访问权限已开启:确认hive-site.xml中
hive.server2.thrift.bind.host配置为0.0.0.0或服务器实际网卡IP,而非127.0.0.1
4. 可选方案:Spark连接Hive
你的环境已部署Spark,在Scala生态下使用Spark连接Hive更便捷,无需单独引入JDBC依赖,只需将服务器上的hive-site.xml放到项目resources目录下即可,参考代码如下:
import org.apache.spark.sql.SparkSession object SparkHiveTest extends App { val spark = SparkSession.builder() .appName("HiveConnectTest") .master("local[*]") // 生产环境提交到集群运行时删除该配置 .enableHiveSupport() .getOrCreate() spark.sql("select * from default.testHiveDriverTable").show() spark.stop() }
内容的提问来源于stack exchange,提问作者Tiger Blood
相关产品推荐
相关产品推荐

