The footer of a Parquet file is a FileMetaData structure in Apache
Thrift’s compact protocol, followed by its length (4 bytes, little-endian) and
PAR1. The structures below are from
parquet.thrift
in the parquet-format repository, read 2026-11-12; the number before each field is its Thrift field ID, which is what the
compact protocol stores.
FileMetaData
| ID | Field | Type | Meaning |
|---|---|---|---|
| 1 | version | i32 | Writers should put 1; readers treat 1 and 2 the same. Other values are reserved. |
| 2 | schema | list<SchemaElement> | The schema tree, flattened depth first; the first element is the root. |
| 3 | num_rows | i64 | Rows in the file. |
| 4 | row_groups | list<RowGroup> | |
| 5 | key_value_metadata | list<KeyValue> | Application data. KeyValue: 1 key, 2 value. |
| 6 | created_by | string | The application that wrote the file and its version. |
| 7 | column_orders | list<ColumnOrder> | How min and max are compared for each column. |
| 8 | encryption_algorithm | EncryptionAlgorithm | For files with a plaintext footer and encrypted columns. |
| 9 | footer_signing_key_metadata | binary |
SchemaElement
| ID | Field | Meaning |
|---|---|---|
| 1 | type | Physical type; absent for groups. |
| 2 | type_length | Byte length for FIXED_LEN_BYTE_ARRAY. |
| 3 | repetition_type | 0 REQUIRED, 1 OPTIONAL, 2 REPEATED. |
| 4 | name | Column or group name. |
| 5 | num_children | For groups: how many of the following elements are its children. |
| 6 | converted_type | Older annotation; see converted types. |
| 7 | scale | For decimals. |
| 8 | precision | For decimals. |
| 9 | field_id | The original field ID, when the source schema has field IDs. |
| 10 | logicalType | Newer annotation; see logical types. |
Physical types
| Value | Type | Plain encoding |
|---|---|---|
| 0 | BOOLEAN | 1 bit each, packed from the low bit |
| 1 | INT32 | 4 bytes, little-endian |
| 2 | INT64 | 8 bytes, little-endian |
| 3 | INT96 | 12 bytes, little-endian; deprecated (“new Parquet writers should not write data in INT96”) but used by legacy systems |
| 4 | FLOAT | IEEE 754, 4 bytes |
| 5 | DOUBLE | IEEE 754, 8 bytes |
| 6 | BYTE_ARRAY | 4-byte length, then the bytes |
| 7 | FIXED_LEN_BYTE_ARRAY | type_length bytes |
Converted types
0 UTF8, 1 MAP, 2 MAP_KEY_VALUE, 3
LIST, 4 ENUM, 5 DECIMAL, 6 DATE,
7 TIME_MILLIS, 8 TIME_MICROS, 9
TIMESTAMP_MILLIS, 10 TIMESTAMP_MICROS, 11
UINT_8, 12 UINT_16, 13 UINT_32, 14
UINT_64, 15 INT_8, 16 INT_16, 17
INT_32, 18 INT_64, 19 JSON, 20
BSON, 21 INTERVAL.
Logical types
LogicalType is a union; the field ID says which:
| ID | Logical type | Parameters |
|---|---|---|
| 1 | STRING | UTF-8 text in a BYTE_ARRAY |
| 2 | MAP | |
| 3 | LIST | |
| 4 | ENUM | |
| 5 | DECIMAL | 1 scale, 2 precision |
| 6 | DATE | Days since 1970-01-01 in INT32 |
| 7 | TIME | 1 isAdjustedToUTC, 2 unit |
| 8 | TIMESTAMP | 1 isAdjustedToUTC, 2 unit (TimeUnit: 1 MILLIS, 2 MICROS, 3 NANOS) |
| 10 | INTEGER | 1 bitWidth (8, 16, 32, 64), 2 isSigned |
| 11 | UNKNOWN | Always null |
| 12 | JSON | |
| 13 | BSON | |
| 14 | UUID | 16-byte FIXED_LEN_BYTE_ARRAY |
| 15 | FLOAT16 | 2-byte FIXED_LEN_BYTE_ARRAY |
| 16 | VARIANT | Embedded Variant values; specification_version |
| 17 | GEOMETRY | Well-Known Binary features with linear (planar) edges |
| 18 | GEOGRAPHY | As geometry, with an edge interpolation algorithm (0 spherical, 1 Vincenty, 2 Thomas, 3 Andoyer, 4 Karney) |
| 19 | FILE | A group referring to a file or a range of bytes, stored inline or in an external file |
| 20 | FINITE_VECTOR | The outer group of a LIST-like three-level structure in which every non-null vector has exactly num_elements elements |
ID 9 is reserved for INTERVAL.
RowGroup
| ID | Field | Meaning |
|---|---|---|
| 1 | columns | list<ColumnChunk>, one per leaf column, in schema order. |
| 2 | total_byte_size | Uncompressed size of all column data. |
| 3 | num_rows | Rows in the group. |
| 4 | sorting_columns | list<SortingColumn>: 1 column_idx, 2 descending, 3 nulls_first. |
| 5 | file_offset | Where the group’s first page starts. |
| 6 | total_compressed_size | |
| 7 | ordinal | The group’s number in the file. |
ColumnChunk
| ID | Field | Meaning |
|---|---|---|
| 1 | file_path | Another file holding the data; absent when it is this file. |
| 2 | file_offset | Deprecated; should not be used. |
| 3 | meta_data | ColumnMetaData. |
| 4, 5 | offset_index_offset, _length | Where the page index’s offset index is. |
| 6, 7 | column_index_offset, _length | Where the column index (per-page min and max) is. |
| 8 | crypto_metadata | For encrypted columns. |
| 9 | encrypted_column_metadata | The ColumnMetaData, encrypted. |
ColumnMetaData
| ID | Field | Meaning |
|---|---|---|
| 1 | type | Physical type. |
| 2 | encodings | Every encoding used in the chunk. |
| 3 | path_in_schema | Names from the root to the column. |
| 4 | codec | Compression codec. |
| 5 | num_values | Values, including nulls. |
| 6, 7 | total_uncompressed_size, total_compressed_size | Including page headers. |
| 8 | key_value_metadata | |
| 9 | data_page_offset | First data page. |
| 10 | index_page_offset | Unused. |
| 11 | dictionary_page_offset | The dictionary page, if any. |
| 12 | statistics | Statistics for the chunk. |
| 13 | encoding_stats | list<PageEncodingStats>: 1 page_type, 2 encoding, 3 count. |
| 14, 15 | bloom_filter_offset, bloom_filter_length | Where the column’s Bloom filter data is, from the start of the file, and its size. |
| 16 | size_statistics | For estimating memory use: unencoded byte-array data size and repetition and definition level histograms. |
| 17 | geospatial_statistics | For geometry and geography columns: a bounding box and the geospatial type codes present. |
Compression codecs
0 UNCOMPRESSED, 1 SNAPPY, 2 GZIP, 3
LZO, 4 BROTLI, 5 LZ4 (added in 2.4, now
deprecated), 6 ZSTD, 7 LZ4_RAW (added in 2.9).
Statistics
| ID | Field | Meaning |
|---|---|---|
| 1, 2 | max, min | Deprecated: determined by signed comparison only. Use max_value and min_value. |
| 3 | null_count | |
| 4 | distinct_count | |
| 5, 6 | max_value, min_value | Plain-encoded, compared as the column order says. |
| 7, 8 | is_max_value_exact, is_min_value_exact | Whether the value is the real maximum or minimum, or a truncated bound. |
| 9 | nan_count | Number of NaN values in floating-point columns. |