蜂巢:创建数据库失败,出现“数据库已存在”

时间:2018-12-18 22:36:31

标签: apache-spark hive apache-spark-sql

我有一个测试套件,可以运行多个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克隆的容器内,这意味着它可能不会污染环境,而不是先前运行的应用程序。

我在启用蜂巢支持的情况下运行。

1 个答案:

答案 0 :(得分:0)

尝试一下:

您绝对正确,在创建数据库之前检查数据库是否存在很重要。这应该可以正常工作,并且对于配置单元而言更容易检查。

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

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

这应该对您有用。