Spark 2.3中dropTempTable()函数使用问题求助
解决Spark 2.3版本删除临时表(视图)的问题
Spark从1.x升级到2.x之后,临时表的API确实有不小的变化,我当初升级的时候也踩过这个坑,咱们一步步理清楚:
首先得明确:Spark 2.x里已经没有“临时表”的概念了,取而代之的是临时视图(Temporary View)和全局临时视图(Global Temporary View),对应的删除方法也和1.6的dropTempTable完全不同,这就是你之前三种尝试都失败的原因。
为什么你的三种尝试都失败?
- 通过DF调用
dropTempTable:DataFrame实例本身从来没有这个方法,临时视图是注册在SparkSession的元数据catalog里的,和DF实例解绑,所以这种方式从一开始就不对; - 通过Spark实例调用
dropTempTable:SparkSession类也没有这个方法,1.6里这个方法属于SQLContext,但2.x里SQLContext被SparkSession整合,相关操作都移到了spark.catalog下; - 通过
spark.catalog.dropTempTable:这个方法在Spark 2.x里已经被标记为过时(deprecated),而且在2.3版本中可能已经被移除,官方推荐用专门针对视图的方法。
正确的删除方式
根据你创建的视图类型,选择对应的方法:
1. 删除普通临时视图(最常用)
如果你是用df.createOrReplaceTempView("xyz")创建的临时视图,用下面的代码删除:
// Scala示例 spark.catalog.dropTempView("xyz") # Python示例 spark.catalog.dropTempView("xyz")
2. 删除全局临时视图
如果创建的是全局临时视图(用df.createOrReplaceGlobalTempView("xyz")),需要用全局视图专属的删除方法:
// Scala示例 spark.catalog.dropGlobalTempView("xyz") # Python示例 spark.catalog.dropGlobalTempView("xyz")
注意:全局临时视图的访问路径是
global_temp.xyz,但删除的时候只需要传入视图名xyz即可。
3. 用SQL语句删除(兼容写法)
如果你更习惯用SQL操作,也可以直接执行DROP VIEW语句:
// 删除普通临时视图 spark.sql("DROP VIEW IF EXISTS xyz") // 删除全局临时视图 spark.sql("DROP VIEW IF EXISTS global_temp.xyz")
IF EXISTS可以避免视图不存在时抛出异常,推荐加上。
额外小技巧
删除前可以先检查视图是否存在,避免报错:
// 检查普通临时视图是否存在 if (spark.catalog.existsTempView("xyz")) { spark.catalog.dropTempView("xyz") } // 检查全局临时视图是否存在 if (spark.catalog.existsGlobalTempView("xyz")) { spark.catalog.dropGlobalTempView("xyz") }
内容的提问来源于stack exchange,提问作者Aakash Basu
相关产品推荐
相关产品推荐

