我有一个测试套件,可以运行多个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
的环境。
我能给出的唯一解释是目录中有一些损坏的元数据,而spark sql认为该数据库存在,而现在已经不存在了。
问题也发生在带有项目的新git克隆的容器内,这意味着它可能不会污染环境,而不是先前运行的应用程序。
我在启用蜂巢支持的情况下运行。
答案 0 :(得分:0)
尝试一下:
您绝对正确,在创建数据库之前检查数据库是否存在很重要。这应该可以正常工作,并且对于配置单元而言更容易检查。
def dbExists(db: String) = spark.sql(s"show databases like '$db'").count > 0
spark.sql(s"create database if not exists $db")
这应该对您有用。