Databricks迁移后如何可靠获取Unity Catalog表的行数与文件数?
解决Unity Catalog表行数/文件数查询问题
针对你迁移后需要筛选空表或无文件表的需求,以下是几个比DESCRIBE DETAIL更可靠的方案:
1. 先更新统计信息,再查Unity Catalog系统表
DESCRIBE DETAIL的字段为空通常是因为表未收集统计信息,先执行统计更新,再通过系统表获取数据:
- 批量更新单个schema下所有表的统计:
-- 替换为你的catalog和schema名称 USE CATALOG your_catalog; USE SCHEMA your_schema; -- 生成并执行ANALYZE命令 SELECT CONCAT('ANALYZE TABLE ', table_name, ' COMPUTE STATISTICS;') FROM information_schema.tables WHERE table_type = 'BASE TABLE'; - 查询统计后的表行数与文件数:
注:SELECT table_catalog, table_schema, table_name, row_count, (SELECT COUNT(*) FROM delta.`${table_location}`) AS num_files FROM information_schema.tables WHERE table_type = 'BASE TABLE' -- 筛选空表或无文件的表 AND (row_count = 0 OR (SELECT COUNT(*) FROM delta.`${table_location}`) = 0);information_schema.tables中的row_count字段仅在执行ANALYZE TABLE后才会填充,table_location字段可直接获取表的存储路径。
2. 直接查询表行数(适合快速验证空表)
如果仅需判断是否为空表,直接执行COUNT(*)是最准确的方式,批量处理可以用脚本生成查询:
SELECT CONCAT('SELECT ''', table_catalog, '.', table_schema, '.', table_name, ''' AS table_name, COUNT(*) AS row_count FROM ', table_catalog, '.', table_schema, '.', table_name, ';') FROM information_schema.tables WHERE table_type = 'BASE TABLE';
将生成的语句批量执行后,即可筛选出row_count = 0的空表。
3. 查询表的存储文件数(针对无文件的表)
对于仅创建表结构未写入数据的空表,可以通过表路径直接枚举文件:
- 用SQL查询Delta表的文件数:
SELECT table_catalog, table_schema, table_name, (SELECT COUNT(DISTINCT path) FROM delta.`${table_location}`) AS num_files FROM information_schema.tables WHERE table_type = 'BASE TABLE' AND (SELECT COUNT(DISTINCT path) FROM delta.`${table_location}`) = 0; - 用Databricks工具函数批量检查:
catalog_name = "your_catalog" schema_name = "your_schema" tables = spark.sql(f"SELECT table_name, table_location FROM {catalog_name}.information_schema.tables WHERE table_schema = '{schema_name}' AND table_type = 'BASE TABLE'").collect() for table in tables: files = dbutils.fs.ls(table.table_location) if len(files) == 0: print(f"无文件表:{catalog_name}.{schema_name}.{table.table_name}")
内容的提问来源于stack exchange,提问作者Tiago
相关产品推荐
相关产品推荐

