假设我有一张名为
data
的表,它是一些时间序列。它的存储方式如下:
/data
/date=2022-11-30
/region=usa
part-000001.parquet
part-000002.parquet
我有两个分区键和两个镶木地板文件分区。我可以轻松列出分区键的文件:
dbfs.fs.ls('/data/date=2022-11-30/region=usa')
但是,如果我现在对表进行更新,它会重新生成镶木地板文件,现在该目录中有
4 files
。
如何检索镶木地板文件的
latest version
?我真的必须循环遍历所有 _delta_log
状态文件并重建状态吗?或者我是否必须运行 VACCUM
来清理旧版本,以便我可以获得最新的文件?
一定有一个神奇的功能。
Delta Lake 本身在其事务日志中跟踪所有这些信息。当您使用支持 Delta Lake 的引擎或 API 查询 Delta 表时,它会在幕后读取此事务日志,以确定哪些文件构成该版本的表。
对于您的示例,假设这四个文件是:
/data
/date=2022-11-30
/region=usa
part-000001.parquet
part-000002.parquet
part-000003.parquet
part-000004.parquet
Delta事务日志本身包含每个表版本的文件路径,例如:
# VO | first version of the table
/data
/date=2022-11-30
/region=usa
part-000001.parquet
part-000002.parquet
# V1 | second version of the table
/data
/date=2022-11-30
/region=usa
part-000003.parquet
part-000004.parquet
如果您想使用 Scala/JVM 获取文件列表,可以使用 Delta Standalone 和/或 Delta Rust 使用 Delta Rust 和/或 Python 绑定。
如果您想在 Spark SQL 中执行此操作和/或深入了解相关详细信息,请查看深入 Delta Lake:解压事务日志,其中包括有关此主题的视频、博客和笔记本。还有一个后续视频,名为 在沉积物 v2 下。