Parquet format versions

This page describes how features are added to the Parquet format specification and how they affect reader and writer compatibility. See the Implementation status page for which implementations (arrow, parquet-java, arrow-rs, etc.) support each feature.

Note: If you find out-of-date information, please open an issue or pull request.

Feature compatibility

The Parquet format spec classifies changes by their effect on reader and writer compatibility. Changes differ in their forward compatibility — whether an older reader can read files that use a newer feature.

Forward compatible features remain readable by older readers, with a possibly degraded experience: some metadata may be missing or performance may suffer, but the reader does not fail. Examples:

  • Bloom filters: a reader that ignores them skips the pruning metadata but still reads the data correctly.
  • Logical type annotations such as VARIANT: an older reader reads the underlying physical column (e.g. BYTE_ARRAY) as raw bytes without applying the logical type.

Forward incompatible features make the data unreadable to older software. Examples:

  • New encodings (e.g. the DELTA_* encodings, BYTE_STREAM_SPLIT, RLE_DICTIONARY): a reader that does not implement them cannot decode the column values.
  • Data Page V2 headers: a reader that only understands DataPageHeader cannot parse DataPageHeaderV2 pages.

FileMetadata version field

Each Parquet file has a version field in the thrift FileMetadata. This field has historically been used inconsistently: writers populate 1 or 2 without a consistent relationship to the features actually used. See the note in parquet.thrift and this discussion for details.

parquet-format release versions

The Thrift definition is released independently of implementations such as parquet-java or arrow-rs, following the Apache release process. This release version is not recorded in the FileMetaData. Note that release numbering DOES NOT FOLLOW semantic versioning: minor releases (e.g. 2.10.0 to 2.11.0) sometimes contain forward incompatible features.

Adding new features

New features are added by discussion and voting on the parquet dev mailing list (full process in the contributing guide). Once approved, a feature is added to the spec and ships in the next parquet-format release.

Forward incompatible features by version

Forward incompatible features and the format version each became available in. Columns include:

  • Release: The parquet-format version the feature was released in.
  • Source: Link to all changes in the parquet-format release.
  • PRs: The specific pull requests that added the feature to the specification (features added before Parquet moved to Apache in 2014 have no entry, as the original pull request records no longer exist).
  • Approved: The mailing list thread where the feature was approved.
FeatureReleaseSourcePRsApprovedNotes
BYTE_STREAM_SPLIT
(Additional Types)
2.11.02.10.0..2.11.0#2292024-03-18
LZ4_RAW2.9.02.8.0..2.9.0#168
BYTE_STREAM_SPLIT2.8.02.7.0..2.8.0#1442019-12-03
Modular encryption2.7.02.6.0..2.7.0#94, #1422019-01-16
ZSTD2.4.02.3.1..2.4.0#70
LZ4 (deprecated)2.4.02.3.1..2.4.0#70, #168
BROTLI2.4.02.3.1..2.4.0#40
Data Page V22.0.01.0.0..2.0.0
RLE_DICTIONARY2.0.01.0.0..2.0.0
DELTA_LENGTH_BYTE_ARRAY2.0.01.0.0..2.0.0
DELTA_BYTE_ARRAY2.0.01.0.0..2.0.0
DELTA_BINARY_PACKED2.0.01.0.0..2.0.0
INT96 (deprecated)1.0.01.0.0
INT641.0.01.0.0
INT321.0.01.0.0
FLOAT1.0.01.0.0
FIXED_LEN_BYTE_ARRAY1.0.01.0.0
DOUBLE1.0.01.0.0
BYTE_ARRAY1.0.01.0.0
BOOLEAN1.0.01.0.0
Data Page V11.0.01.0.0
RLE1.0.01.0.0
PLAIN_DICTIONARY1.0.01.0.0
PLAIN1.0.01.0.0
BIT_PACKED (deprecated)1.0.01.0.0
UNCOMPRESSED1.0.01.0.0
SNAPPY1.0.01.0.0
LZO1.0.01.0.0
GZIP1.0.01.0.0

Note: Files with an encrypted footer use different magic bytes (PARE instead of PAR1), making it clear to readers they must support modular encryption to read the file; plaintext footer files use PAR1 so legacy readers can still read their unencrypted columns.

Forward compatible additions

Older readers can read files that use these features but may not understand the new information.

FeatureReleaseSourcePRsApprovedNotes
IEEE 754 total order and NaN counts2.13.02.12.0..2.13.0#5142026-05-26
Variant shredding2.12.02.11.0..2.12.0#456, #4612025-08-24
VARIANT2.12.02.11.0..2.12.0#456, #4602025-08-24
GEOMETRY (BYTE_ARRAY)2.11.02.10.0..2.11.0#2402025-02-09
GEOGRAPHY (BYTE_ARRAY)2.11.02.10.0..2.11.0#2402025-02-09
Geospatial statistics2.11.02.10.0..2.11.0#2402025-02-09
Binary protocol extensions2.11.02.10.0..2.11.0#2542024-09-06
FLOAT16 (FIXED_LEN_BYTE_ARRAY(2))2.10.02.9.0..2.10.0#1842023-10-13
Size statistics2.10.02.9.0..2.10.0#1972023-11-14
Bloom filter length2.10.02.9.0..2.10.0#194
xxHash-based bloom filters2.7.02.6.0..2.7.0#112, #1452019-09-09
UUID (FIXED_LEN_BYTE_ARRAY(16))2.6.02.5.0..2.6.0#71, #93
Nanosecond TIME/TIMESTAMP2.6.02.5.0..2.6.0#102
UNKNOWN (always null)2.4.02.3.1..2.4.0#51
LogicalType union2.4.02.3.1..2.4.0#51Supersedes ConvertedType enum
deprecated in 2.9.0
TIME (INT64)2.4.02.3.1..2.4.0#23
Page index2.4.02.3.1..2.4.0#72
TIMESTAMP (INT64)2.2.02.1.0..2.2.0#3, #5, #23
TIME (INT32)2.2.02.1.0..2.2.0#3, #5
JSON (BYTE_ARRAY)2.2.02.1.0..2.2.0#3, #5
INTERVAL (FIXED_LEN_BYTE_ARRAY(12))2.2.02.1.0..2.2.0#3, #5
Signed and unsigned integer logical types (INT32, INT64)2.2.02.1.0..2.2.0#3, #5, #51
DATE (INT32)2.2.02.1.0..2.2.0#3, #5
BSON (BYTE_ARRAY)2.2.02.1.0..2.2.0#3, #5
DECIMAL (INT64)2.1.02.0.0..2.1.0
DECIMAL (INT32)2.1.02.0.0..2.1.0
DECIMAL (FIXED_LEN_BYTE_ARRAY)2.1.02.0.0..2.1.0
DECIMAL (BYTE_ARRAY)2.1.02.0.0..2.1.0
ENUM (BYTE_ARRAY)2.0.01.0.0..2.0.0
STRING (BYTE_ARRAY)1.0.01.0.0
MAP1.0.01.0.0
LIST1.0.01.0.0
Page CRC32 checksum1.0.01.0.0