metadata当中可以发现,snapshot元数据也是存储在metadata文件当中的。

Snapshot是一个接口,其实现为BaseSnapshot,相关字段就存储在这里。这里可以结合SnapshotParser来查看规范中的字段与java类字段中的映射关系。

// snapshot-id:快照id
private final long snapshotId;  
// parent-snapshot-id:父快照的id,没有父快照的则忽略
private final Long parentId;  
// sequence-number:用来追踪表修改顺序的单调递增的long值
private final long sequenceNumber;  
// timestamp-ms:快照创建时的时间戳,用于垃圾回收
private final long timestampMillis;  
// manifest-list:快照对应的manifest list文件路径
private final String manifestListLocation;  
// operation:本次快照的数据操作类型,取值来自DataOperations
private final String operation;  
// summary:快照修改的一些汇总信息,例如上面的operation就是这里的一个字段
private final Map<String, String> summary;  
// schema-id:创建当前快照使用的schema-id
private final Integer schemaId;  
// manifests:iceberg v1版本manifest list嵌入到快照当中使用,v2开始淘汰了
private final String[] v1ManifestLocations;

这样看来快照元数据本身并没有它多的信息,更像一个关联关系,将一些版本相关的信息汇总起来(例如schema-id, sequence-number),和manifest list关联。

在BaseSnapshot当中还有几个延迟加载的字段

// lazily initialized  
private transient List<ManifestFile> allManifests = null;  
private transient List<ManifestFile> dataManifests = null;  
private transient List<ManifestFile> deleteManifests = null;  
private transient List<DataFile> addedDataFiles = null;  
private transient List<DataFile> removedDataFiles = null;  
private transient List<DeleteFile> addedDeleteFiles = null;  
private transient List<DeleteFile> removedDeleteFiles = null;

其中的allManifests正是使用的读取解析manifestListLocation指定的manifest list文件获得。

this.allManifests = ManifestLists.read(fileIO.newInputFile(manifestListLocation));

manifest list文件当中存储的就是一个manifest元数据列表,解析出来就是List<ManifestFile>。在manifest list中进一步说明。