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
指定要列出表的数据库名称。FROM与IN在语法上完全等价,仓库中的 ANTLR 语法规则可佐证:
SHOW TABLES ((FROM | IN) identifierReference)? (LIKE? pattern=stringLit)? (AS JSON)?见 SqlBaseParser.g4。
当省略该参数时,命令使用当前数据库,这在 ShowTablesCommand.run 中有明确实现:
val db = databaseName.getOrElse(catalog.getCurrentDatabase)regex_pattern
指定用于过滤表的正则表达式模式。官方文档明确约定以下三条规则,务必牢记:
- 除
*和|两个字符外,模式按照正则表达式的方式工作; *单独出现时匹配 0 个或多个任意字符;|用于分隔多个不同的正则表达式,任意一个匹配即可;- 模式在匹配前会去除首尾空白,且匹配不区分大小写。
这三条规则在源码 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 TABLES与SHOW FUNCTIONS,其注释也明确说明了通配符约定,是理解模式过滤行为的关键代码。
输出格式
命令返回三列结果:
| 列名 | 含义 |
|---|---|
database | 表所属数据库名称 |
tableName | 表名 |
isTemporary | 是否为临时视图(false表示永久表/视图,true表示临时视图) |
V2 数据源执行路径中的输出定义见 ShowTablesExec,每一行由toCatalystRow(ident.namespace().quoted, ident.name(), isTempView(ident, catalog))构成;临时视图的判定通过session.sessionState.catalog.isTempView(...)完成。
使用示例
以下示例完整继承自官方文档,可直接在spark-sql或spark-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 个或多个字符,因此sam、sam1均被命中。
按模式过滤:多模式并用
-- 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*匹配sam、sam1,suj精确匹配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的结果中且isTemporary为true。
数据库不存在时报错
当指定的数据库不存在时,命令会抛出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 语法解析 → 逻辑计划 → 物理执行。
- 语法解析:语法规则定义在 SqlBaseParser.g4,
SHOW TABLES生成showTables语法树节点; - 命令构造:解析器将其转换为
ShowTablesCommand(V1 路径),tables.scala 中的定义接收databaseName、tableIdentifierPattern、output等参数;而 V2 路径由 ShowTablesExec 承载; - 目录查询:V1 路径通过
catalog.listTables(db, pattern)或catalog.listTables(db)获取表标识,见 tables.scala;V2 路径则对RelationCatalog调用listRelationSummaries、对纯TableCatalog调用listTables; - 模式过滤:对每个表标识应用
StringUtils.filterPattern,不匹配的跳过(V2 实现见 ShowTablesExec.scala); - 结果输出:每行输出
(database, tableName, isTemporary),其中isTemporary通过会话目录的isTempView判定。
相关语句
SHOW TABLES常与以下 DDL 语句配套使用,官方文档的"Related Statements"一节列出的链接均已转换为仓库根目录相对路径:
- CREATE TABLE
- DROP TABLE
- CREATE DATABASE
- DROP DATABASE
小结
SHOW TABLES默认列出当前数据库的表,可用FROM/IN切换数据库;LIKE子句支持正则模式过滤,其中*是通配符、|是多模式分隔符,匹配不区分大小写且自动去除首尾空白;- 输出三列:
database、tableName、isTemporary,临时视图以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),仅供参考