更新时间:2022-12-13 GMT+08:00

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持久化表。

图1 Spark表管理层次

当Session退出时,用户操作相关的临时表将自动删除。建议用户不要手动删除临时表。

删除临时表时,其优先级与查询相同,从高到低为Spark临时表、Hive临时表、Hive持久化表。如果想直接删除Hive表,不删除Spark临时表,您可以直接使用drop table DbName.TableName命令。