spark.catalog.tableExists遇不存在的库抛异常而非返回false是什么原因
问题原因
- Spark版本行为差异:Spark 3.0及更早版本中,
spark.catalog.tableExists的实现逻辑是先校验指定数据库是否存在,数据库不存在直接抛出NoSuchDatabaseException,仅当数据库存在时,才会校验表是否存在并返回布尔值。Spark 3.1版本对该方法做了兼容性优化,传入带库名的全量表名时,无论库不存在还是表不存在,都会统一返回false。你其他运行环境用的是Spark 3.1+版本,而ScalaTest依赖的Spark版本为3.0及以下,就会出现行为不一致的问题。 - SparkSession配置差异:如果两个环境Spark版本一致,那需要检查ScalaTest中初始化SparkSession时是否开启了Hive支持。未添加
enableHiveSupport()配置时,Spark默认使用内存Catalog(InMemoryCatalog),对不存在库的处理逻辑和HiveCatalog不同,也会触发抛出异常而不是返回false的情况。
兼容解决方案
如果需要兼容不同版本的运行环境,可以自行封装判断逻辑,先校验数据库是否存在,再校验表是否存在:
def checkTableExists(spark: SparkSession, fullTableName: String): Boolean = { val splitName = fullTableName.split("\\.", 2) if (splitName.length != 2) { // 无库名的表默认查询当前默认数据库 spark.catalog.tableExists(fullTableName) } else { val dbName = splitName(0) val tableName = splitName(1) // 先判断库是否存在,再判断表是否存在,兼容低版本异常逻辑 spark.catalog.databaseExists(dbName) && spark.catalog.tableExists(dbName, tableName) } }
内容的提问来源于stack exchange,提问作者victorcalabuig
相关产品推荐
相关产品推荐

