Snapshot
快照(Snapshot)是在某个时间点上捕捉表状态的方式。用户可以通过最新的快照访问表的最新数据。通过时间回溯,用户还可以通过较早的快照访问表的先前状态。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| private static final String FIELD_VERSION = "version"; private static final String FIELD_ID = "id"; private static final String FIELD_SCHEMA_ID = "schemaId"; private static final String FIELD_BASE_MANIFEST_LIST = "baseManifestList"; private static final String FIELD_DELTA_MANIFEST_LIST = "deltaManifestList"; private static final String FIELD_CHANGELOG_MANIFEST_LIST = "changelogManifestList"; private static final String FIELD_INDEX_MANIFEST = "indexManifest"; private static final String FIELD_COMMIT_USER = "commitUser"; private static final String FIELD_COMMIT_IDENTIFIER = "commitIdentifier"; private static final String FIELD_COMMIT_KIND = "commitKind"; private static final String FIELD_TIME_MILLIS = "timeMillis"; private static final String FIELD_LOG_OFFSETS = "logOffsets"; private static final String FIELD_TOTAL_RECORD_COUNT = "totalRecordCount"; private static final String FIELD_DELTA_RECORD_COUNT = "deltaRecordCount"; private static final String FIELD_CHANGELOG_RECORD_COUNT = "changelogRecordCount"; private static final String FIELD_WATERMARK = "watermark";
|
Partition
Paimon 采用与 Apache Hive 相同的分区概念来分离数据。分区是根据特定列(如日期、城市和部门)的值将表划分成相关部分的可选方式。每个表可以有一个或多个分区键来标识特定的分区。通过分区,用户可以高效地操作表中的一部分记录,请参考文档如何划分为多个分区。
如果定义了主键,分区键必须是主键的子集。
Bucket
未分区的表,或者分区表中的分区,被细分为 bucket,以为数据提供额外的结构,以便进行更高效的查询。
bucket 的范围由记录中一个或多个列的哈希值确定。用户可以通过提供存储桶键选项来指定bucket 列。如果未指定 bucket 键选项,则主键(如果定义)或完整记录将被用作 bucket 键。
bucket 是读写的最小存储单元,因此 bucket 的数量限制了最大的处理并行性。然而,这个数量不应该过大,因为会导致大量的小文件和低读取性能。一般来说,每个 bucket 中推荐的数据大小约为1GB。
请参阅资料了解文件如何被划分为 bucket。此外,如果您想在创建表后调整 bucket 的数量,请参阅重新调整 bucket。
一致性保证
Paimon 的写操作使用两阶段提交协议来原子地将一批记录提交到表中,每次提交最多会产生两个快照。
对于同时修改同一表的任意两个写入者,只要它们不修改同一个存储桶,它们的提交可以并行进行。如果它们修改同一个存储桶,只能保证快照隔离性。也就是说,最终的表状态可能是两个提交的混合,但不会丢失任何更改。