
# Spark SQL在不同DB都可以显示临时表
#### 问题
切换数据库之后，为什么还能看到之前数据库的临时表？
1. 创建一个DataSource的临时表，例如以下建表语句。
   ```
   create temporary table ds_parquet
   using org.apache.spark.sql.parquet
   options(path '/tmp/users.parquet');
   ```
   
2. 切换到另外一个数据库，执行*show tables* ，依然可以看到上个步骤创建的临时表。
   ```
   0: jdbc:hive2://192.168.169.84:22550/default> show tables;
   +-----------------+--------------+--+
   |    tableName    | isTemporary  |
   +-----------------+--------------+--+
   | ds_parquet      | true         |
   | cmb_tbl_carbon  | false        |
   +-----------------+--------------+--+
   2 rows selected (0.109 seconds)
   0: jdbc:hive2://192.168.169.84:22550/default>
   ```
   
 
#### 回答
Spark的表管理层次如[图1]所示，最底层是Spark的临时表，存储着使用DataSource方式的临时表，在这一个层面中没有数据库的概念，因此对于这种类型表，表名在各个数据库中都是可见的。
上层为Hive的MetaStore，该层有了各个DB之分。在每个DB中，又有Hive的临时表与Hive的持久化表，因此在Spark中允许三个层次的同名数据表。
查询的时候，Spark SQL优先查看是否有Spark的临时表，再查找当前DB的Hive临时表，最后查找当前DB的Hive持久化表。
图1Spark表管理层次   
![](https://support.huaweicloud.com/cmpntguide-mrs/zh-cn_image_0265793535.jpg)
当Session退出时，用户操作相关的临时表将自动删除。建议用户不要手动删除临时表。
删除临时表时，其优先级与查询相同，从高到低为Spark临时表、Hive临时表、Hive持久化表。如果想直接删除Hive表，不删除Spark临时表，您可以直接使用*drop table DbName.TableName*命令。
