Apache spark 配置单元:使用'创建数据库失败;数据库已存在';

Apache spark 配置单元:使用'创建数据库失败;数据库已存在';,apache-spark,hive,apache-spark-sql,Apache Spark,Hive,Apache Spark Sql,我有一个测试套件,它运行几个spark单元测试。每个测试都共享相同的基本spark上下文。 在运行这些测试期间,我检查数据库是否存在,如果不存在,我将创建它: def dbExists(db: String) = spark.sql(s"show databases like '$db'").count > 0 if (!dbExists(db)) spark.sql(s"create database $db") 由于某些原因,其中一项测试失败了。调试时我看到,对于某个dbdbExi

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

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)
每次启动测试时,我都会为每个不是默认数据库的数据库清理运行的环境
drop database db cascade
。 我能给出的唯一解释是,目录中有一些损坏的元数据,spark sql认为数据库存在,但它已经不存在了

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

我在启用配置单元支持的情况下运行。

尝试以下操作:

您完全正确,在创建数据库之前检查数据库是否存在非常重要。这应该是可行的,而且对蜂巢来说更容易检查

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

spark.sql(s"create database if not exists $db")
这应该对你有用