我有一个测试套件,该套件运行了几个火花单元测试。这些测试中的每一个都具有相同的基础火花上下文。在运行这些测试期间,我检查是否存在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")
这应该对您有用。