hive:创建数据库失败,返回“database already exists”

ozxc1zmp  于 2021-06-27  发布在  Hive
关注(0)|答案(1)|浏览(1014)

我有一个测试套件,运行几个Spark单元测试。这些测试中的每一个都共享相同的基本spark上下文。在运行这些测试的过程中,我会检查数据库是否存在,如果不存在,我会创建它:

def dbExists(db: String) = spark.sql(s"show databases like '$db'").count > 0

if (!dbExists(db)) spark.sql(s"create database $db")

由于某些原因,其中一项测试失败了。我在某个数据库里看到了 dbExists(db) 返回false,并且创建命令失败

ERROR RetryingHMSHandler:159 - AlreadyExistsException(message:Database db already exists)
at org.apache.hadoop.hive.metastore.HiveMetaStore$HMSHandler.create_database(HiveMetaStore.java:891)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)

每次测试开始时,我都会清理正在运行的环境 drop database db cascade 对于不是默认数据库的每个数据库。我能给出的唯一解释是,目录中有一些损坏的元数据,sparksql认为db存在,而它已经不存在了。
这个问题也发生在一个容器中,容器中有一个项目的新git克隆,这意味着它不是可能污染环境的应用程序的前一次运行。
我在启用配置单元支持的情况下运行。

nwsw7zdq

nwsw7zdq1#

试试这个:
你是绝对正确的,在创建数据库之前检查数据库的存在是很重要的。这应该是工作,并将更容易为Hive检查。

def dbExists(db: String) = spark.sql(s"show databases like '$db'").count > 0

spark.sql(s"create database if not exists $db")

这应该对你有用。

相关问题