如何在Databricks SQL中为动态表名添加单引号并统计多表行数
在纯Databricks SQL中动态统计指定Schema下表行数的解决方案
纯Databricks SQL实现(解决单引号问题)
核心是用双单引号转义生成带单引号的表名字段,再拼接成完整查询语句动态执行。
步骤1:生成单表统计语句(带正确单引号)
先验证单表语句的生成逻辑,确保表名被单引号包裹:
SELECT CONCAT( 'SELECT ''', table_name, ''' AS table_name, COUNT(*) AS row_count FROM ', table_schema, '.', table_name ) AS sql_statement FROM system.information_schema.tables WHERE table_schema = 'your_target_schema' -- 替换成你的目标schema AND table_type = 'BASE TABLE'; -- 仅统计实体表,排除视图
这里''', table_name, '''会被解析为'表名',因为SQL中用两个单引号表示一个转义的单引号。
步骤2:动态合并并执行所有表的查询
用STRING_AGG把所有单表语句合并为UNION ALL结构,再通过EXECUTE IMMEDIATE直接执行:
-- 设置目标Schema变量 SET target_schema = 'your_target_schema'; -- 声明变量存储完整查询语句 DECLARE full_sql STRING; -- 生成完整的UNION ALL查询 SET full_sql = ( SELECT STRING_AGG( CONCAT( 'SELECT ''', table_name, ''' AS table_name, COUNT(*) AS row_count FROM ', table_schema, '.', table_name ), ' UNION ALL ' ) FROM system.information_schema.tables WHERE table_schema = ${target_schema} AND table_type = 'BASE TABLE' ); -- 执行动态SQL EXECUTE IMMEDIATE full_sql;
执行后会直接返回所有表的名称和对应行数。
备选:用Python + Spark SQL实现
如果纯SQL的字符串拼接觉得繁琐,也可以用Python代码更灵活地处理:
from pyspark.sql import SparkSession spark = SparkSession.builder.getOrCreate() target_schema = "your_target_schema" # 获取目标Schema下的所有实体表 tables = spark.sql(f""" SELECT table_name FROM system.information_schema.tables WHERE table_schema = '{target_schema}' AND table_type = 'BASE TABLE' """).collect() # 初始化结果DataFrame result_df = None for table in tables: table_name = table["table_name"] # 查询当前表的行数 count_df = spark.sql(f""" SELECT '{table_name}' AS table_name, COUNT(*) AS row_count FROM {target_schema}.{table_name} """) # 合并结果 if result_df is None: result_df = count_df else: result_df = result_df.union(count_df) # 展示结果(也可以写入表或导出) result_df.show(truncate=False)
内容的提问来源于stack exchange,提问作者Judith
相关产品推荐
相关产品推荐

