
Apache Spark SQL 語法精解SHOW TABLES 命令的完整使用指南【免費下載鏈接】sparkApache Spark - A unified analytics engine for large-scale data processing項目地址: https://gitcode.com/gh_mirrors/sp/spark導(dǎo)讀SHOW TABLES是 Apache Spark SQL 中最常用的元數(shù)據(jù)查詢命令之一用于列出指定數(shù)據(jù)庫Database下的全部表并支持通過正則模式過濾。本文以當(dāng)前倉庫官方文檔 docs/sql-ref-syntax-aux-show-tables.md 為骨架結(jié)合倉庫中 SQL 解析、命令執(zhí)行與測試代碼系統(tǒng)講解該命令的語法、參數(shù)規(guī)則、輸出格式與底層實現(xiàn)原理。讀完本文你將掌握SHOW TABLES的完整用法能夠自如地按數(shù)據(jù)庫、按模式含通配符與多模式列出表清單并理解它如何區(qū)分永久表與臨時視圖。命令功能概述SHOW TABLES語句返回指定數(shù)據(jù)庫中的所有表。核心語義如下若指定了數(shù)據(jù)庫則返回該數(shù)據(jù)庫下的表若未指定數(shù)據(jù)庫則返回當(dāng)前數(shù)據(jù)庫current database下的表輸出結(jié)果可選的通過一個匹配模式matching pattern進行過濾輸出結(jié)果同時包含表與視圖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二者等價均可指定數(shù)據(jù)庫名稱LIKE regex_pattern可選用于按正則表達式模式過濾輸出所有子句均可省略SHOW TABLES單獨使用即列出當(dāng)前數(shù)據(jù)庫的全部表。參數(shù)詳解{ FROM | IN } database_name指定要列出表的數(shù)據(jù)庫名稱。FROM與IN在語法上完全等價倉庫中的 ANTLR 語法規(guī)則可佐證SHOW TABLES ((FROM | IN) identifierReference)? (LIKE? patternstringLit)? (AS JSON)?見 SqlBaseParser.g4。當(dāng)省略該參數(shù)時命令使用當(dāng)前數(shù)據(jù)庫這在 ShowTablesCommand.run 中有明確實現(xiàn)val db databaseName.getOrElse(catalog.getCurrentDatabase)regex_pattern指定用于過濾表的正則表達式模式。官方文檔明確約定以下三條規(guī)則務(wù)必牢記除*和|兩個字符外模式按照正則表達式的方式工作*單獨出現(xiàn)時匹配 0 個或多個任意字符|用于分隔多個不同的正則表達式任意一個匹配即可模式在匹配前會去除首尾空白且匹配不區(qū)分大小寫。這三條規(guī)則在源碼 StringUtils.filterPattern 中得到精確對應(yīng)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 }從實現(xiàn)可以看到pattern.trim()對應(yīng)去除首尾空白規(guī)則(?i)前綴對應(yīng)不區(qū)分大小寫規(guī)則subPattern.replaceAll(\\*, .*)將*轉(zhuǎn)換為正則的.*匹配 0 個或多個任意字符pattern.split(\\|)按|拆分多個子模式只要有一個匹配即保留該表名單個子模式如果本身就是非法正則PatternSyntaxException會被靜默忽略不影響其他子模式的匹配。此外該工具方法同時服務(wù)于SHOW TABLES與SHOW FUNCTIONS其注釋也明確說明了通配符約定是理解模式過濾行為的關(guān)鍵代碼。輸出格式命令返回三列結(jié)果列名含義database表所屬數(shù)據(jù)庫名稱tableName表名isTemporary是否為臨時視圖false表示永久表/視圖true表示臨時視圖V2 數(shù)據(jù)源執(zhí)行路徑中的輸出定義見 ShowTablesExec每一行由toCatalystRow(ident.namespace().quoted, ident.name(), isTempView(ident, catalog))構(gòu)成臨時視圖的判定通過session.sessionState.catalog.isTempView(...)完成。使用示例以下示例完整繼承自官方文檔可直接在spark-sql或spark-shell中驗證。列出當(dāng)前數(shù)據(jù)庫的全部表-- List all tables in default database SHOW TABLES; ---------------------------- |database|tableName|isTemporary| ---------------------------- | default| sam| false| | default| sam1| false| | default| suj| false| ----------------------------使用 FROM 指定數(shù)據(jù)庫-- List all tables from userdb database SHOW TABLES FROM userdb; ---------------------------- |database|tableName|isTemporary| ---------------------------- | userdb| user1| false| | userdb| user2| false| ----------------------------使用 IN 指定數(shù)據(jù)庫與 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三者并集即為結(jié)果。進階使用技巧模式是正則表達式不只是通配符由于除*、|外的模式部分按正則語義處理你可以使用更復(fù)雜的表達式。例如統(tǒng)一測試 ShowTablesSuiteBase 中的用例-- 匹配以 table_name_1 或 table_name_2 開頭的表 SHOW TABLES FROM ns1 LIKE table_name_1*|table_name_2*; -- 匹配以 2b 結(jié)尾的表 SHOW TABLES FROM ns1 LIKE *2b;匹配不區(qū)分大小寫模式匹配是大小寫不敏感的源碼中通過(?i)實現(xiàn)因此LIKE SAM*與LIKE sam*結(jié)果一致。臨時視圖也會出現(xiàn)在結(jié)果中isTemporary列為true的行即臨時視圖。V2 路徑的 ShowTablesExec 對實現(xiàn)了RelationCatalog的目錄會調(diào)用listRelationSummaries以便視圖與表并列展示測試 ShowTablesSuiteBase 也驗證了CREATE TEMP VIEW之后臨時視圖會出現(xiàn)在SHOW TABLES的結(jié)果中且isTemporary為true。數(shù)據(jù)庫不存在時報錯當(dāng)指定的數(shù)據(jù)庫不存在時命令會拋出SCHEMA_NOT_FOUND類錯誤見測試 ShowTablesSuiteBase-- 假設(shè) nonexist 不存在 SHOW TABLES IN nonexist; -- 拋出 AnalysisExceptionSCHEMA_NOT_FOUND編程接口調(diào)用在 Scala 中也可以通過 DataFrame API 執(zhí)行并檢查結(jié)果與統(tǒng)一測試基座中的用法一致val df spark.sql(SHOW TABLES FROM userdb) df.show()底層實現(xiàn)原理SHOW TABLES的完整執(zhí)行鏈路可以概括為SQL 文本 → ANTLR 語法解析 → 邏輯計劃 → 物理執(zhí)行。語法解析語法規(guī)則定義在 SqlBaseParser.g4SHOW TABLES生成showTables語法樹節(jié)點命令構(gòu)造解析器將其轉(zhuǎn)換為ShowTablesCommandV1 路徑tables.scala 中的定義接收databaseName、tableIdentifierPattern、output等參數(shù)而 V2 路徑由 ShowTablesExec 承載目錄查詢V1 路徑通過catalog.listTables(db, pattern)或catalog.listTables(db)獲取表標識見 tables.scalaV2 路徑則對RelationCatalog調(diào)用listRelationSummaries、對純TableCatalog調(diào)用listTables模式過濾對每個表標識應(yīng)用StringUtils.filterPattern不匹配的跳過V2 實現(xiàn)見 ShowTablesExec.scala結(jié)果輸出每行輸出(database, tableName, isTemporary)其中isTemporary通過會話目錄的isTempView判定。相關(guān)語句SHOW TABLES常與以下 DDL 語句配套使用官方文檔的Related Statements一節(jié)列出的鏈接均已轉(zhuǎn)換為倉庫根目錄相對路徑CREATE TABLEDROP TABLECREATE DATABASEDROP DATABASE小結(jié)SHOW TABLES默認列出當(dāng)前數(shù)據(jù)庫的表可用FROM/IN切換數(shù)據(jù)庫LIKE子句支持正則模式過濾其中*是通配符、|是多模式分隔符匹配不區(qū)分大小寫且自動去除首尾空白輸出三列database、tableName、isTemporary臨時視圖以isTemporary true標識底層由ShowTablesCommand/ShowTablesExec配合StringUtils.filterPattern實現(xiàn)行為細節(jié)去空白、大小寫、通配符轉(zhuǎn)換、非法正則忽略均可從源碼得到印證。掌握這一命令可以幫助你在使用 Spark SQL 進行元數(shù)據(jù)探查、腳本自動化與數(shù)據(jù)治理時快速摸清庫表結(jié)構(gòu)是日常開發(fā)中高頻、高效的必備技能?!久赓M下載鏈接】sparkApache Spark - A unified analytics engine for large-scale data processing項目地址: https://gitcode.com/gh_mirrors/sp/spark創(chuàng)作聲明:本文部分內(nèi)容由AI輔助生成(AIGC),僅供參考