Skip to main content

Storage Specification

This section describes the files and metadata that make up a Paimon table. Use it when inspecting storage or implementing a reader, writer, or integration. For an introduction to the concepts, start with Basic Concepts.

Metadata and File Relationships​

A snapshot is the entry point to a committed table state. Its base and delta manifest lists identify the manifests needed to resolve live data files. Optional references describe changelog files and table indexes.

Snapshot metadata links to schema, data and changelog manifests, and an index manifest; manifests identify the files used by the table.

LayerReferenceWhat it describes
Table definitionSchemaFields, field IDs, partition keys, primary keys, and options
Committed stateSnapshotSchema and manifest references, commit information, and record counts
File inventoryManifestFile additions and deletions, partition and file statistics, and index metadata
Data organizationData FilesPartition and bucket paths, primary-key records, and changelog files
Physical encodingFile Format, Row FormatFormat-specific type mappings and the Paimon row-format binary layout
Table indexesTable IndexDynamic bucket indexes and deletion vectors
Per-file indexesFile IndexIndex headers and encodings for column indexes within a data file

Table indexes and per-file indexes have different roles and metadata. See the global index guide for global query-index behavior and its compatibility requirements.

Example Table Directory​

The following Flink SQL creates a primary-key table with one fixed bucket and Parquet data files:

CREATE CATALOG my_catalog WITH (
'type' = 'paimon',
'warehouse' = '/your/path'
);
USE CATALOG my_catalog;

CREATE TABLE my_table (
k INT PRIMARY KEY NOT ENFORCED,
f0 INT,
f1 STRING
) WITH (
'bucket' = '1',
'file.format' = 'parquet'
);

INSERT INTO my_table VALUES (1, 11, '111');

A simplified directory after the first commit looks like this. UUIDs and file counters are abbreviated; the exact number of manifests depends on the write.

warehouse/
└── default.db/
└── my_table/
├── bucket-0/
│ └── data-<uuid>-0.parquet
├── manifest/
│ ├── manifest-<uuid>-0
│ ├── manifest-list-<uuid>-0
│ └── manifest-list-<uuid>-1
├── schema/
│ └── schema-0
└── snapshot/
├── EARLIEST
├── LATEST
└── snapshot-1

Partitioned tables add partition directories above the bucket directories. Features such as dynamic buckets and deletion vectors add index files under index/ and an index manifest under manifest/. External data paths can place data files outside the table directory.

EARLIEST and LATEST are snapshot lookup hints. The selected snapshot's metadata determines which files to read; readers must not treat all files present in a directory as live table data.