ARTICLE DETAIL

资讯详情

深耕商务建站与企业官网运营的一线实战洞察。

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

Apache Spark SQL 语法精解:SHOW TABLES 命令的完整使用指南 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? patternstringLit)? (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、sam1suj精确匹配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; -- 抛出 AnalysisExceptionSCHEMA_NOT_FOUND编程接口调用在 Scala 中也可以通过 DataFrame API 执行并检查结果与统一测试基座中的用法一致val df spark.sql(SHOW TABLES FROM userdb) df.show()底层实现原理SHOW TABLES的完整执行链路可以概括为SQL 文本 → ANTLR 语法解析 → 逻辑计划 → 物理执行。语法解析语法规则定义在 SqlBaseParser.g4SHOW TABLES生成showTables语法树节点命令构造解析器将其转换为ShowTablesCommandV1 路径tables.scala 中的定义接收databaseName、tableIdentifierPattern、output等参数而 V2 路径由 ShowTablesExec 承载目录查询V1 路径通过catalog.listTables(db, pattern)或catalog.listTables(db)获取表标识见 tables.scalaV2 路径则对RelationCatalog调用listRelationSummaries、对纯TableCatalog调用listTables模式过滤对每个表标识应用StringUtils.filterPattern不匹配的跳过V2 实现见 ShowTablesExec.scala结果输出每行输出(database, tableName, isTemporary)其中isTemporary通过会话目录的isTempView判定。相关语句SHOW TABLES常与以下 DDL 语句配套使用官方文档的Related Statements一节列出的链接均已转换为仓库根目录相对路径CREATE TABLEDROP TABLECREATE DATABASEDROP 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),仅供参考
返回列表
PREV
查看更多资讯
NEXT
返回资讯列表