apache / apache/parquet-format
Track unknown logical type compatibility across Parquet implementations
- Dominant language
- Thrift
- Stars
- 2.6k
- Forks
- 508
- Avg merge
- 2d 8h
- Merged PRs (30d)
- 4
Description
## Background
Parquet classifies new logical types as **forward compatible**:
> "New logical types are considered forward compatible despite the loss of semantic meaning."
-- https://parquet.apache.org/docs/file-format/versions/#compatibility-categories
**Readers that do not recognize a logical type should still read the underlying physical representation rather than reject the file.**
This is increasingly important for `VARIANT`, `GEOMETRY`, `GEOGRAPHY`, and future logical types.
Related discussion:
* https://lists.apache.org/thread/flfzz94ftdrdop9d5b0o1hkqkprzj3l5
* An older `parquet-java` reader (1.15.2) failed to read a Parquet file containing the newer `VARIANT` logical type. The reader rejected the file instead of ignoring the unknown logical annotation and exposing the underlying physical representation.
## Golden test files from `parquet-testing`
| File | Purpose |
|------|---------|
| [`unknown-logical-type.parquet`](https://github.com/apache/parquet-testing/blob/master/data/unknown-logical-type.parquet) | File containing an unknown logical type |
| [`case-001.parquet`](https://github.com/apache/parquet-testing/blob/master/shredded_variant/case-001.parquet) | File containing the `VARIANT` logical type. Readers that do not recognize the VARIANT logical type should treat it as an unknown logical type. |
Expected behavior:
- File metadata and schema can be parsed.
- Underlying physical data can be read.
- Unsupported logical semantics are ignored.
- The reader does not fail solely because the logical type is unknown.
## Compatibility status (updated as of July 20, 2026)
Implementation list from https://parquet.apache.org/docs/file-format/implementationstatus/
| Implementation | Version tested | `unknown-logical-type.parquet` | `case-001.parquet` (`VARIANT`) | Issue / PR |
|---|---|---|---|---|
| [parquet-java](https://github.com/apache/parquet-java) | 1.17.0 | ❌ Unknown types: [#2709](https://github.com/apache/parquet-java/issues/2709) (open; no fix PR) [1]
✅ | ✅ VARIANT: [#3072](https://github.com/apache/parquet-java/pull/3072) (merged in 1.16.0) | ❌ Older-reader VARIANT: [#3633](https://github.com/apache/parquet-java/issues/3633) (open) [2]
✅ Fixed in https://github.com/apache/parquet-java/pull/3669, should be available in 1.18.x |
| [Apache Arrow C++](https://github.com/apache/arrow) | 25.0.0 | ✅ Unknown types: [#41764](https://github.com/apache/arrow/issues/41764) / [#41765](https://github.com/apache/arrow/pull/41765) | ✅ VARIANT: [#45937](https://github.com/apache/arrow/issues/45937), [#50121](https://github.com/apache/arrow/pull/50121), [#50122](https://github.com/apache/arrow/pull/50122), [#50232](https://github.com/apache/arrow/pull/50232) | ✅ |
| [Apache Arrow Rust (arrow-rs)](https://github.com/apache/arrow-rs) | 59.1.0 | ✅ Unknown types: [#8776](https://github.com/apache/arrow-rs/issues/8776) / [#8777](https://github.com/apache/arrow-rs/pull/8777) | ✅ VARIANT: [#6736](https://github.com/apache/arrow-rs/issues/6736), [#8408](https://github.com/apache/arrow-rs/pull/8408), [#8480](https://github.com/apache/arrow-rs/issues/8480) | ✅ |
| [Apache Arrow Go](https://github.com/apache/arrow-go) | 18.6.0 / main (`f7bacb4`) | ❌ Unknown types: no Arrow Go issue/PR found; related upstream [#41764](https://github.com/apache/arrow/issues/41764) / [#41765](https://github.com/apache/arrow/pull/41765) | ✅ VARIANT: [#310](https://github.com/apache/arrow-go/issues/310), [#352](https://github.com/apache/arrow-go/pull/352), [#433](https://github.com/apache/arrow-go/pull/433), [#434](https://github.com/apache/arrow-go/pull/434), [#455](https://github.com/apache/arrow-go/pull/455) | ❌ |
| [DuckDB](https://github.com/duckdb/duckdb) | v1.5.4 | ✅ Unknown types: [#16378](https://github.com/duckdb/duckdb/pull/16378) | ✅ VARIANT support: [#18187](https://github.com/duckdb/duckdb/pull/18187), [#18224](https://github.com/duckdb/duckdb/pull/18224), [#18996](https://github.com/duckdb/duckdb/pull/18996) | ✅ |
| [Polars](https://github.com/pola-rs/polars) | 1.42.1 | ❌ Unknown types: fails during footer metadata parsing; no exact issue/PR ([related #20978](https://github.com/pola-rs/polars/issues/20978)) | ❌ VARIANT: fails during footer metadata parsing; no exact issue/PR ([related #20978](https://github.com/pola-rs/polars/issues/20978), analogous [#27893](https://github.com/pola-rs/polars/issues/27893) / [#27896](https://github.com/pola-rs/polars/pull/27896)) | ❌ |
| [cuDF](https://github.com/rapidsai/cudf) | 26.06.01 | ✅ Unknown types: existing skip/fallback behavior documented in [#22310](https://github.com/rapidsai/cudf/pull/22310) / [`893daed`](https://github.com/rapidsai/cudf/commit/893daed17410e77125500934fe832a1d3eeca67f) | ✅ VARIANT: [#22312](https://github.com/rapidsai/cudf/issues/22312), [#22310](https://github.com/rapidsai/cudf/pull/22310), [#22416](https://github.com/rapidsai/cudf/pull/22416) | ✅ |
| [Hyparquet](https://github.com/hyparam/hyparquet) | 1.26.2 | ✅ Unknown types: [`8a98407`](https://github.com/hyparam/hyparquet/commit/8a984077348fb412852fa7af2338b1f777b13f89) / [`892c933`](https://github.com/hyparam/hyparquet/commit/892c933a05cb10aa6f1bb2b32d1439e787cf518b) | ✅ VARIANT: [#149](https://github.com/hyparam/hyparquet/pull/149), [`6290e85`](https://github.com/hyparam/hyparquet/commit/6290e85cb411f91ea30a6bcd99407e33902fabc8), [`45a7d5e`](https://github.com/hyparam/hyparquet/commit/45a7d5ecf8fb0271e9916171301e103c9d29e5ff) | ✅ |
[1] Fails during footer schema conversion, before projection or decoding. This is inconsistent with Parquet's forward-compatibility expectation for unknown logical annotations.
[2] Pre-1.16 versions do not understand VARIANT, so it behaves like an unknown logical type and fails during footer conversion, even if unprojected.
## Completion criteria
- Record results and tested versions for each implementation.
- Open upstream issues for failures.
- Add regression tests using the shared `parquet-testing` files.
- Backport fixes where practical.
Contributor guide
Research direction
Start by running the listed implementations against parquet-testing/data/unknown-logical-type.parquet and parquet-testing/shredded_variant/case-001.parquet, recording each tested version and result. Open upstream issues for failures, add regression coverage using those shared files, and document the compatibility results; completion includes backporting fixes where practical.
Written by the indexing model from the issue text.
Assessment
- Tech stack
- cpp, go, java, javascript, rust
- Domain
- data-engineering, documentation, testing
- Issue type
- Feature
- Difficulty
- 5/5
- Estimated time
- Over a week
- Activity status
- Quiet
- Clarity
- Mostly clear
- Newbie friendliness
- 38/100