Apache Spark SQL 语法精解:SHOW TABLES 命令的完整使用指南
2026/9/19 21:16:36 网站建设 项目流程

Apache Spark SQL 语法精解:SHOW TABLES 命令的完整使用指南

【免费下载链接】sparkApache Spark - A unified analytics engine for large-scale data processing项目地址: https://gitcode.com/gh_mirrors/sp/spark

导读

SHOW TABLES是 Apache Spark SQL 中最常用的元数据查询命令之一,用于列出指定数据库(Database)下的全部表,并支持通过正则模式过滤。本文以当前仓库官方文档 docs/sql-ref-syntax-aux-show-tables.md 为骨架,结合仓库中 SQL 解析、命令执行与测试代码,系统讲解该命令的语法、参数规则、输出格式与底层实现原理。读完本文,你将掌握SHOW TABLES的完整用法,能够自如地按数据库、按模式(含通配符与多模式)列出表清单,并理解它如何区分永久表与临时视图。

命令功能概述

SHOW TABLES语句返回指定数据库中的所有表。核心语义如下:

  • 若指定了数据库,则返回该数据库下的表;
  • 若未指定数据库,则返回当前数据库(current database)下的表;
  • 输出结果可选的通过一个匹配模式(matching pattern)进行过滤;
  • 输出结果同时包含表与视图isTemporary列用于标识临时视图(temporary view)。

该语句的官方定义位于 ShowTablesCommand 的注释中:"A command for users to get tables in the given database. If a databaseName is not given, the current database will be used.",与本文档描述完全一致。

语法

SHOW TABLES [ { FROM | IN } database_name ] [ LIKE regex_pattern ]

语法要点:

  • { FROM | IN } database_name:二者等价,均可指定数据库名称;
  • LIKE regex_pattern:可选,用于按正则表达式模式过滤输出;
  • 所有子句均可省略:SHOW TABLES单独使用即列出当前数据库的全部表。

参数详解

{ FROM | IN } database_name

指定要列出表的数据库名称。FROMIN在语法上完全等价,仓库中的 ANTLR 语法规则可佐证:

SHOW TABLES ((FROM | IN) identifierReference)? (LIKE? pattern=stringLit)? (AS JSON)?

见 SqlBaseParser.g4。

当省略该参数时,命令使用当前数据库,这在 ShowTablesCommand.run 中有明确实现:

val db = databaseName.getOrElse(catalog.getCurrentDatabase)

regex_pattern

指定用于过滤表的正则表达式模式。官方文档明确约定以下三条规则,务必牢记:

  1. *|两个字符外,模式按照正则表达式的方式工作;
  2. *单独出现时匹配 0 个或多个任意字符;|用于分隔多个不同的正则表达式,任意一个匹配即可
  3. 模式在匹配前会去除首尾空白,且匹配不区分大小写

这三条规则在源码 StringUtils.filterPattern 中得到精确对应:

def filterPattern(names: Seq[String], pattern: String): Seq[String] = { val funcNames = scala.collection.mutable.SortedSet.empty[String] pattern.trim().split("\\|").foreach { subPattern => try { val regex = ("(?i)" + subPattern.replaceAll("\\*", ".*")).r funcNames ++= names.filter{ name => regex.pattern.matcher(name).matches() } } catch { case _: PatternSyntaxException => } } funcNames.toSeq }

从实现可以看到:

  • pattern.trim()对应"去除首尾空白"规则;
  • "(?i)"前缀对应"不区分大小写"规则;
  • subPattern.replaceAll("\\*", ".*")*转换为正则的.*(匹配 0 个或多个任意字符);
  • pattern.split("\\|")|拆分,多个子模式只要有一个匹配即保留该表名;
  • 单个子模式如果本身就是非法正则(PatternSyntaxException),会被静默忽略,不影响其他子模式的匹配。

此外,该工具方法同时服务于SHOW TABLESSHOW FUNCTIONS,其注释也明确说明了通配符约定,是理解模式过滤行为的关键代码。

输出格式

命令返回三列结果:

列名含义
database表所属数据库名称
tableName表名
isTemporary是否为临时视图(false表示永久表/视图,true表示临时视图)

V2 数据源执行路径中的输出定义见 ShowTablesExec,每一行由toCatalystRow(ident.namespace().quoted, ident.name(), isTempView(ident, catalog))构成;临时视图的判定通过session.sessionState.catalog.isTempView(...)完成。

使用示例

以下示例完整继承自官方文档,可直接在spark-sqlspark-shell中验证。

列出当前数据库的全部表

-- List all tables in default database SHOW TABLES; +--------+---------+-----------+ |database|tableName|isTemporary| +--------+---------+-----------+ | default| sam| false| | default| sam1| false| | default| suj| false| +--------+---------+-----------+

使用 FROM 指定数据库

-- List all tables from userdb database SHOW TABLES FROM userdb; +--------+---------+-----------+ |database|tableName|isTemporary| +--------+---------+-----------+ | userdb| user1| false| | userdb| user2| false| +--------+---------+-----------+

使用 IN 指定数据库(与 FROM 等价)

-- List all tables in userdb database SHOW TABLES IN userdb; +--------+---------+-----------+ |database|tableName|isTemporary| +--------+---------+-----------+ | userdb| user1| false| | userdb| user2| false| +--------+---------+-----------+

按模式过滤:前缀通配

-- List all tables from default database matching the pattern `sam*` SHOW TABLES FROM default LIKE 'sam*'; +--------+---------+-----------+ |database|tableName|isTemporary| +--------+---------+-----------+ | default| sam| false| | default| sam1| false| +--------+---------+-----------+

sam*中的*匹配 0 个或多个字符,因此samsam1均被命中。

按模式过滤:多模式并用

-- List all tables matching the pattern `sam*|suj` SHOW TABLES LIKE 'sam*|suj'; +--------+---------+-----------+ |database|tableName|isTemporary| +--------+---------+-----------+ | default| sam| false| | default| sam1| false| | default| suj| false| +--------+---------+-----------+

|分隔两个子模式,sam*匹配samsam1suj精确匹配suj,三者并集即为结果。

进阶使用技巧

模式是正则表达式,不只是通配符

由于除*|外的模式部分按正则语义处理,你可以使用更复杂的表达式。例如统一测试 ShowTablesSuiteBase 中的用例:

-- 匹配以 table_name_1 或 table_name_2 开头的表 SHOW TABLES FROM ns1 LIKE 'table_name_1*|table_name_2*'; -- 匹配以 2b 结尾的表 SHOW TABLES FROM ns1 LIKE '*2b';

匹配不区分大小写

模式匹配是大小写不敏感的(源码中通过"(?i)"实现),因此LIKE 'SAM*'LIKE 'sam*'结果一致。

临时视图也会出现在结果中

isTemporary列为true的行即临时视图。V2 路径的 ShowTablesExec 对实现了RelationCatalog的目录会调用listRelationSummaries以便视图与表并列展示;测试 ShowTablesSuiteBase 也验证了CREATE TEMP VIEW之后临时视图会出现在SHOW TABLES的结果中且isTemporarytrue

数据库不存在时报错

当指定的数据库不存在时,命令会抛出SCHEMA_NOT_FOUND类错误,见测试 ShowTablesSuiteBase:

-- 假设 nonexist 不存在 SHOW TABLES IN nonexist; -- 抛出 AnalysisException:SCHEMA_NOT_FOUND

编程接口调用

在 Scala 中也可以通过 DataFrame API 执行并检查结果(与统一测试基座中的用法一致):

val df = spark.sql("SHOW TABLES FROM userdb") df.show()

底层实现原理

SHOW TABLES的完整执行链路可以概括为:SQL 文本 → ANTLR 语法解析 → 逻辑计划 → 物理执行

  1. 语法解析:语法规则定义在 SqlBaseParser.g4,SHOW TABLES生成showTables语法树节点;
  2. 命令构造:解析器将其转换为ShowTablesCommand(V1 路径),tables.scala 中的定义接收databaseNametableIdentifierPatternoutput等参数;而 V2 路径由 ShowTablesExec 承载;
  3. 目录查询:V1 路径通过catalog.listTables(db, pattern)catalog.listTables(db)获取表标识,见 tables.scala;V2 路径则对RelationCatalog调用listRelationSummaries、对纯TableCatalog调用listTables
  4. 模式过滤:对每个表标识应用StringUtils.filterPattern,不匹配的跳过(V2 实现见 ShowTablesExec.scala);
  5. 结果输出:每行输出(database, tableName, isTemporary),其中isTemporary通过会话目录的isTempView判定。

相关语句

SHOW TABLES常与以下 DDL 语句配套使用,官方文档的"Related Statements"一节列出的链接均已转换为仓库根目录相对路径:

  • CREATE TABLE
  • DROP TABLE
  • CREATE DATABASE
  • DROP DATABASE

小结

  • SHOW TABLES默认列出当前数据库的表,可用FROM/IN切换数据库;
  • LIKE子句支持正则模式过滤,其中*是通配符、|是多模式分隔符,匹配不区分大小写且自动去除首尾空白;
  • 输出三列:databasetableNameisTemporary,临时视图以isTemporary = true标识;
  • 底层由ShowTablesCommand/ShowTablesExec配合StringUtils.filterPattern实现,行为细节(去空白、大小写、通配符转换、非法正则忽略)均可从源码得到印证。

掌握这一命令,可以帮助你在使用 Spark SQL 进行元数据探查、脚本自动化与数据治理时快速摸清库表结构,是日常开发中高频、高效的必备技能。

【免费下载链接】sparkApache Spark - A unified analytics engine for large-scale data processing项目地址: https://gitcode.com/gh_mirrors/sp/spark

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询