我有一个测试套件,它运行几个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的环境。我能给出的唯一解释是,一些损坏的元数据在目录中,spark sql认为数据库存在,而它不再存在。
这个问题也发生在一个容器中,其中包含项目的新git克隆,这意味着它不是之前运行的应用程序可能会污染环境。
我在启用配置单元支持的情况下运行。
发布于 2019-12-19 23:16:38
试试这个:
你说的完全正确,在创建之前检查数据库的存在是很重要的。这应该会起作用,并且会更容易让蜂窝检查。
def dbExists(db: String) = spark.sql(s"show databases like '$db'").count > 0
spark.sql(s"create database if not exists $db")这对你来说应该是可行的。
https://stackoverflow.com/questions/53842136
复制相似问题