我有一个测试套件,运行几个Spark单元测试。这些测试中的每一个都共享相同的基本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
对于不是默认数据库的每个数据库。我能给出的唯一解释是,目录中有一些损坏的元数据,sparksql认为db存在,而它已经不存在了。
这个问题也发生在一个容器中,容器中有一个项目的新git克隆,这意味着它不是可能污染环境的应用程序的前一次运行。
我在启用配置单元支持的情况下运行。
1条答案
按热度按时间nwsw7zdq1#
试试这个:
你是绝对正确的,在创建数据库之前检查数据库的存在是很重要的。这应该是工作,并将更容易为Hive检查。
这应该对你有用。