Lance表目录介绍
Lance表目录是最初创建数据集的位置。每个Lance表都有且仅有一个根目录,它作为数据集文件的主要存储位置。Lance表根目录下包含标准子目录结构(data/、_versions/、_transactions/、_deletions/、_indices/、_refs/、tree/),用于组织数据集的文件。
{table_name}/
data/
*.lance -- 列数据文件
_versions/
*.manifest -- Manifest 文件 (每个版本一个)
latest_version_hint.json -- 当前最新版本信息
_transactions/
*.txn -- 事务文件(提交协调)
_deletions/
*.arrow -- 删除向量文件 (Arrow格式)
*.bin -- 删除向量文件 (位图格式)
_indices/
{UUID}/
... -- 索引内容 (按索引类型不同)
_refs/
tags/
*.json -- Tag 元数据
branches/
*.json -- Branch 元数据
tree/
{branch_name}/
... -- Branch 列数据文件 - 数据文件
模式:data/{uuid-based-filename}.lance
数据文件使用基于UUID的文件名,针对S3吞吐量进行了优化。文件名由UUID(16 字节)生成,将前3个字节转换为 24字符的二进制字符串,其余13个字节转换为26字符的十六进制字符串,最终形成50字符的文件名。二进制前缀(而非十六进制)提供了每个字符的最大熵,使S3的内部分区能够快速识别访问模式并相应地扩展,从而最大限度地减少限流。
示例:data/101100101101010011010110a1b2c3d4e5f6g7h8i9j0.lance
- 清单文件列表
清单文件存储在 _versions/ 目录中,其命名方案支持原子提交。
- V1:{version}.manifest - 单调递增的版本号(例如 1.manifest, 2.manifest)
- V2:{u64::MAX - version:020}.manifest - 反向排序的字典顺序,实现了对最新版本的高效发现(例如V2第一个版本为 18446744073709551614.manifest)
_versions/latest_version_hint.json 以JSON格式记录最新提交的版本。
latest_version_hint.json文件内容如下:{"version": 42}它的存在是为了加速在列表操作成本高昂的存储系统上进行最新版本的发现:读取器可以读取提示,并通过HEAD请求探测更高的版本,而不是列出整个目录;如果提示缺失或过期,则回退到完整列表操作。该提示纯粹是一种优化手段。它始终可以安全删除,绝不会影响正确性,且可以被不识别它的读取器忽略。写入器可以选择不写入此文件。
- 事务文件
模式:_transactions/{read_version}-{uuid}.txn
其中 read_version 是构建该事务时所依据的表版本。
示例:_transactions/5-550e8400-e29b-41d4-a716-446655440000.txn
- 删除文件
模式:_deletions/{fragment_id}-{read_version}-{id}.{extension}
删除文件使用两种扩展名:用于Arrow IPC格式(稀疏删除)的.arrow和用于Roaring位图格式(密集删除)的.bin。
示例:_deletions/42-10-a1b2c3d4.arrow
- 索引文件
每个索引的内容存储在基准路径 (base path) 下的 _indices/{UUID} 目录中。将此位置称为索引目录。索引目录中存储的实际内容取决于索引类型。这些可以是索引实现定义的任意文件。然而,它们通常由包含索引数据结构的Lance文件组成。这允许重用现有的Lance文件格式代码来读写索引数据。