如何清理Delta Lake各类表并查询非Delta表的操作用户?
查询表/视图访问用户及Databricks数据清理方案
一、查询Parquet表、视图、外部表的创建/访问用户
1. 视图(View)
- 执行
DESCRIBE EXTENDED <view_name>或SHOW CREATE TABLE <view_name>,结果中的Created By字段会显示创建用户,同时能获取创建时间。 - 要追踪访问记录,需依赖Databricks审计日志,查询系统表
system.access.audit过滤相关操作:
SELECT user_identity.email, operation_name, object_name, timestamp FROM system.access.audit WHERE object_name = '<你的视图名>' AND operation_name IN ('SELECT', 'CREATE VIEW', 'ALTER VIEW') ORDER BY timestamp DESC
2. Parquet表(内部/外部)
- 内部Parquet表:
DESCRIBE EXTENDED <表名>可查到创建者,但无访问历史,同样需要通过审计日志追踪。 - 外部Parquet表:除了用
DESCRIBE EXTENDED获取创建者信息,还可以结合云存储访问日志(如S3、ADLS日志),与Databricks审计日志交叉验证访问记录。
3. 外部表(非Parquet)
逻辑与外部Parquet表一致,通过DESCRIBE EXTENDED查看创建者,利用审计日志+云存储日志组合追踪访问用户。
二、更优的Databricks数据清理方案
1. 基于审计日志的统一访问分析
不管是Delta表、Parquet表还是视图,审计日志是最可靠的访问记录来源。可以创建定时任务,定期分析system.access.audit表,生成各对象的访问报表,标记长期未被访问的对象。
2. 利用Unity Catalog做生命周期管理
如果使用Unity Catalog,可直接为表/视图设置生命周期规则:
- Delta表:设置属性自动清理旧日志和已删除文件:
ALTER TABLE <delta表名> SET TBLPROPERTIES ( delta.logRetentionDuration = '7 days', delta.deletedFileRetentionDuration = '1 days' )
还可给表添加备注标记清理阈值,比如COMMENT '6个月未访问则删除'。
- Parquet/外部表:结合Unity Catalog的权限管理,配合审计日志批量清理长期无访问的对象,同时删除对应存储路径的文件。
3. 分层清理策略
- 临时对象:给临时表/视图打标签,用Databricks Jobs每日清理创建超过7天的临时对象。
- 归档对象:对需要保留但不再使用的数据,归档到低成本存储(如S3 Glacier、ADLS Archive),删除原表后保留指向归档路径的外部表。
- 删除前验证:删除前通过审计日志确认N天内无访问记录,或给相关用户发送通知,避免误删。
4. 自动化清理脚本
编写Python或SQL脚本,结合Databricks API实现:
- 遍历Metastore中的所有表/视图,获取对象类型、创建时间、最后访问时间(从审计日志提取)。
- 对符合清理条件的对象,自动执行
DROP TABLE/DROP VIEW命令,并用dbutils.fs.rm删除外部存储路径的文件。
内容的提问来源于stack exchange,提问作者Saswat Ray
相关产品推荐
相关产品推荐

