Spark SQL在不同DB都可以显示临时表
问题
切换数据库之后,为什么还能看到之前数据库的临时表?
- 创建一个DataSource的临时表,例如以下建表语句。
create temporary table ds_parquet using org.apache.spark.sql.parquet options(path '/tmp/users.parquet');
- 切换到另外一个数据库,执行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持久化表。
当Session退出时,用户操作相关的临时表将自动删除。建议用户不要手动删除临时表。
删除临时表时,其优先级与查询相同,从高到低为Spark临时表、Hive临时表、Hive持久化表。如果想直接删除Hive表,不删除Spark临时表,您可以直接使用drop table DbName.TableName命令。