配置单元:创建数据库失败,'database already exists'



我有一个测试套件,该套件运行了几个火花单元测试。这些测试中的每一个都具有相同的基础火花上下文。在运行这些测试期间,我检查是否存在DB,如果不是,则我创建了它:

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

由于某些原因,其中一项测试是失败的。调试我看到,对于某个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)

每次开始测试,我都会清洁每个DB运行drop database db cascade的环境,这不是默认的环境。我唯一可以给出的解释是,一些损坏的元数据在目录中,Spark SQL认为DB存在,而它不再存在了。

这个问题也发生在一个带有项目的新git克隆的容器中,这意味着该应用程序的先前运行可能会污染环境。

我启用了Hive支持。

尝试以下:

您是绝对正确的,在创建之前检查数据库的存在很重要。这应该起作用,并且对Hive进行检查将容易得多。

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

这应该对您有用。

相关内容

  • 没有找到相关文章

最新更新