This is an automated email from the ASF dual-hosted git repository.
emkornfield pushed a commit to branch production
in repository https://gitbox.apache.org/repos/asf/parquet-site.git
The following commit(s) were added to refs/heads/production by this push:
new 562de32 Add dates for implementation features. (#144)
562de32 is described below
commit 562de32f40db9d53d9c34d8bfb4279848d3a1c11
Author: emkornfield <[email protected]>
AuthorDate: Fri Dec 19 08:29:21 2025 -0800
Add dates for implementation features. (#144)
* Add dates for implementation features.
This adds dates to the data model for implementation features.
- It then uses those dates to add hyperlinks to implementation notes
when available.
- It creates a new table summarizing implementation status per year
based on dates.
- Added an entry to extending BYTE_STREAM_SPLIT to additional types.
The data here was backfilled with AI and spot-checked so it is possible
some of it might be off.
Co-authored-by: Gang Wu <[email protected]>
---
.gitignore | 3 +
.../en/docs/File Format/implementationstatus.md | 2 +-
data/implementations/engines.yaml | 114 +++++++-
data/implementations/features/encodings.yaml | 10 +
data/implementations/features/format-features.yaml | 12 +
data/implementations/features/logical-types.yaml | 12 +
data/implementations/support/arrow-go.yaml | 14 +
data/implementations/support/arrow-rs.yaml | 16 +
data/implementations/support/arrow.yaml | 22 ++
data/implementations/support/cudf.yaml | 5 +
data/implementations/support/duckdb.yaml | 14 +
data/implementations/support/hyparquet.yaml | 2 +
data/implementations/support/parquet-java.yaml | 8 +
layouts/shortcodes/implementation-status.html | 322 ++++++++++++++++++++-
14 files changed, 541 insertions(+), 15 deletions(-)
diff --git a/.gitignore b/.gitignore
index 4e348da..b8022ed 100644
--- a/.gitignore
+++ b/.gitignore
@@ -15,3 +15,6 @@ _vendor/
*.iml
out
+# Vim swp files
+*.swp
+
diff --git a/content/en/docs/File Format/implementationstatus.md
b/content/en/docs/File Format/implementationstatus.md
index 7141d9a..1eb0d64 100644
--- a/content/en/docs/File Format/implementationstatus.md
+++ b/content/en/docs/File Format/implementationstatus.md
@@ -12,7 +12,7 @@ of this page by opening an issue or submitting a pull request.
### Legend
The value in each box means:
-* ✅: supported. Footnote added when support is partial.
+* ✅: supported. Footnote added when support is partial. When data is
available, links to release notes are provided on the implementing version.
* ❌: not supported
* (R): only read support
* (W): only write support
diff --git a/data/implementations/engines.yaml
b/data/implementations/engines.yaml
index 4d6fa6e..dde1572 100644
--- a/data/implementations/engines.yaml
+++ b/data/implementations/engines.yaml
@@ -4,7 +4,33 @@
language: C++
repo_url: https://github.com/apache/arrow/tree/main/cpp/src/parquet
docs_url: https://arrow.apache.org/docs/cpp/parquet.html
- versions: {}
+ versions:
+ default: "18.0.0"
+ releases:
+ "15.0.0":
+ release_date: "2024-01-21"
+ release_notes_url: "https://arrow.apache.org/release/15.0.0.html"
+ "16.0.0":
+ release_date: "2024-04-20"
+ release_notes_url: "https://arrow.apache.org/release/16.0.0.html"
+ "17.0.0":
+ release_date: "2024-07-16"
+ release_notes_url: "https://arrow.apache.org/release/17.0.0.html"
+ "18.0.0":
+ release_date: "2024-10-28"
+ release_notes_url: "https://arrow.apache.org/release/18.0.0.html"
+ "19.0.0":
+ release_date: "2025-01-16"
+ release_notes_url: "https://arrow.apache.org/release/19.0.0.html"
+ "20.0.0":
+ release_date: "2025-04-27"
+ release_notes_url: "https://arrow.apache.org/release/20.0.0.html"
+ "21.0.0":
+ release_date: "2025-07-17"
+ release_notes_url: "https://arrow.apache.org/release/21.0.0.html"
+ "22.0.0":
+ release_date: "2025-10-24"
+ release_notes_url: "https://arrow.apache.org/release/22.0.0.html"
- id: parquet-java
name: parquet-java
@@ -12,7 +38,18 @@
language: Java
repo_url: https://github.com/apache/parquet-java
docs_url: null
- versions: {}
+ versions:
+ default: "1.14.1"
+ releases:
+ "1.14.1":
+ release_date: "2024-07-16"
+ release_notes_url:
"https://github.com/apache/parquet-java/releases/tag/apache-parquet-1.14.1"
+ "1.15.0":
+ release_date: "2024-12-02"
+ release_notes_url:
"https://github.com/apache/parquet-java/releases/tag/apache-parquet-1.15.0"
+ "1.16.0":
+ release_date: "2025-09-03"
+ release_notes_url:
"https://github.com/apache/parquet-java/releases/tag/apache-parquet-1.16.0"
- id: arrow-go
name: arrow-go
@@ -20,15 +57,49 @@
language: Go
repo_url: https://github.com/apache/arrow-go/tree/main/parquet
docs_url: null
- versions: {}
-
+ versions:
+ default: "18.4.0"
+ releases:
+ "18.0.0":
+ release_date: "2024-10-28"
+ release_notes_url: "https://arrow.apache.org/release/18.0.0.html"
+ "18.3.0":
+ release_date: "2024-05-09"
+ release_notes_url:
"https://github.com/apache/arrow-go/releases/tag/v18.3.0"
+ "18.4.0":
+ release_date: "2025-07-21"
+ release_notes_url:
"https://github.com/apache/arrow-go/releases/tag/v18.4.0"
+
- id: arrow-rs
name: arrow-rs
display_name: Apache Arrow Rust
language: Rust
repo_url: https://github.com/apache/arrow-rs/blob/main/parquet/README.md
docs_url: null
- versions: {}
+ versions:
+ default: "52.2.0"
+ releases:
+ "49.0.0":
+ release_date: "2024-07-28"
+ release_notes_url:
"https://github.com/apache/arrow-rs/releases/tag/49.0.0"
+ "52.2.0":
+ release_date: "2024-07-28"
+ release_notes_url:
"https://github.com/apache/arrow-rs/releases/tag/52.2.0"
+ "53.0.0":
+ release_date: "2024-08-31"
+ release_notes_url:
"https://github.com/apache/arrow-rs/releases/tag/53.0.0"
+ "54.3.0":
+ release_date: "2025-03-17"
+ release_notes_url:
"https://github.com/apache/arrow-rs/releases/tag/54.3.0"
+ "55.0.0":
+ release_date: "2025-04-08"
+ release_notes_url:
"https://github.com/apache/arrow-rs/releases/tag/55.0.0"
+ "56.0.0":
+ release_date: "2025-07-29"
+ release_notes_url:
"https://github.com/apache/arrow-rs/releases/tag/56.0.0"
+ "57.0.0":
+ release_date: "2025-10-19"
+ release_notes_url:
"https://github.com/apache/arrow-rs/releases/tag/57.0.0"
- id: cudf
name: cudf
@@ -36,7 +107,18 @@
language: C++
repo_url: https://github.com/rapidsai/cudf
docs_url: null
- versions: {}
+ versions:
+ default: "25.12.00"
+ releases:
+ "25.04.00":
+ release_date: "2025-04-09"
+ release_notes_url:
"https://github.com/rapidsai/cudf/releases/tag/v25.04.00"
+ "25.06.00":
+ release_date: "2025-06-05"
+ release_notes_url:
"https://github.com/rapidsai/cudf/releases/tag/v25.06.00"
+ "25.12.00":
+ release_date: "2025-12-10"
+ release_notes_url:
"https://github.com/rapidsai/cudf/releases/tag/v25.12.00"
- id: hyparquet
name: hyparquet
@@ -44,7 +126,12 @@
language: JavaScript
repo_url: https://github.com/hyparam/hyparquet
docs_url: null
- versions: {}
+ versions:
+ default: "1.23.0"
+ releases:
+ "1.23.0":
+ release_date: "2025-12-10"
+ release_notes_url:
"https://github.com/hyparam/hyparquet/releases/tag/v1.23.0"
- id: duckdb
name: duckdb
@@ -52,4 +139,15 @@
language: C++
repo_url: https://github.com/duckdb/duckdb
docs_url: null
- versions: {}
+ versions:
+ default: "1.4.0"
+ releases:
+ "1.2.0":
+ release_date: "2025-02-05"
+ release_notes_url:
"https://github.com/duckdb/duckdb/releases/tag/v1.2.0"
+ "1.3.0":
+ release_date: "2025-05-21"
+ release_notes_url:
"https://github.com/duckdb/duckdb/releases/tag/v1.3.0"
+ "1.4.0":
+ release_date: "2025-09-16"
+ release_notes_url:
"https://github.com/duckdb/duckdb/releases/tag/v1.4.0"
diff --git a/data/implementations/features/encodings.yaml
b/data/implementations/features/encodings.yaml
index 485b19b..03614d9 100644
--- a/data/implementations/features/encodings.yaml
+++ b/data/implementations/features/encodings.yaml
@@ -26,3 +26,13 @@ features:
- id: encoding-byte-stream-split
display_name: BYTE_STREAM_SPLIT
+ format_version:
+ version: "2.8.0"
+ date: "2020-01-13"
+
+ - id: encoding-byte-stream-split-extended
+ display_name: BYTE_STREAM_SPLIT (Additional Types)
+ spec_url:
https://github.com/apache/parquet-format/commit/e517ac4dbe08d518eb5c2e58576d4c711973db94
+ format_version:
+ version: "2.11.0"
+ date: "2024-03-21"
diff --git a/data/implementations/features/format-features.yaml
b/data/implementations/features/format-features.yaml
index 703a5d9..5a2dbfa 100644
--- a/data/implementations/features/format-features.yaml
+++ b/data/implementations/features/format-features.yaml
@@ -3,6 +3,9 @@ features:
- id: format-bloom-filters
display_name: xxHash-based bloom filters
spec_url:
https://github.com/apache/parquet-format/blob/master/BloomFilter.md
+ format_version:
+ version: "2.7.0"
+ date: "2019-09-25"
- id: format-bloom-filter-length
display_name: Bloom filter length
@@ -14,6 +17,9 @@ features:
- id: format-page-index
display_name: Page index
spec_url: https://github.com/apache/parquet-format/blob/master/PageIndex.md
+ format_version:
+ version: "2.4.0"
+ date: "2018-05-04"
- id: format-page-crc32
display_name: Page CRC32 checksum
@@ -21,10 +27,16 @@ features:
- id: format-modular-encryption
display_name: Modular encryption
spec_url:
https://github.com/apache/parquet-format/blob/master/Encryption.md
+ format_version:
+ version: "2.7.0"
+ date: "2019-09-25"
- id: format-size-statistics
display_name: Size statistics
note: "In parquet.thrift: ColumnMetaData->size_statistics"
+ format_version:
+ version: "2.10.0"
+ date: "2023-11-20"
- id: format-data-page-v2
display_name: Data Page V2
diff --git a/data/implementations/features/logical-types.yaml
b/data/implementations/features/logical-types.yaml
index e6460b0..5d83b0b 100644
--- a/data/implementations/features/logical-types.yaml
+++ b/data/implementations/features/logical-types.yaml
@@ -26,6 +26,9 @@ features:
- id: logical-float16
display_name: FLOAT16
+ format_version:
+ version: "2.10.0"
+ date: "2023-11-20"
- id: logical-date
display_name: DATE
@@ -51,14 +54,23 @@ features:
- id: logical-variant
display_name: VARIANT
spec_url:
https://github.com/apache/parquet-format/blob/master/VariantEncoding.md
+ format_version:
+ version: "2.11.0"
+ date: "2025-03-23"
- id: logical-geometry
display_name: GEOMETRY
spec_url:
https://github.com/apache/parquet-format/blob/master/Geospatial.md#logical-types
+ format_version:
+ version: "2.11.0"
+ date: "2025-03-23"
- id: logical-geography
display_name: GEOGRAPHY
spec_url:
https://github.com/apache/parquet-format/blob/master/Geospatial.md#logical-types
+ format_version:
+ version: "2.11.0"
+ date: "2025-03-23"
- id: logical-list
display_name: LIST
diff --git a/data/implementations/support/arrow-go.yaml
b/data/implementations/support/arrow-go.yaml
index d957660..a7174c0 100644
--- a/data/implementations/support/arrow-go.yaml
+++ b/data/implementations/support/arrow-go.yaml
@@ -35,6 +35,8 @@ support:
status: full
logical-float16:
status: full
+ since_version_read: "18.4.0"
+ since_version_write: "18.4.0"
logical-date:
status: full
logical-time-int32:
@@ -51,6 +53,8 @@ support:
status: full
logical-variant:
status: full
+ since_version_read: "18.4.0"
+ since_version_write: "18.4.0"
logical-geometry:
status: none
logical-geography:
@@ -79,6 +83,12 @@ support:
status: full
encoding-byte-stream-split:
status: full
+ since_version_read: "18.0.0"
+ since_version_write: "18.0.0"
+ encoding-byte-stream-split-extended:
+ status: full
+ since_version_read: "18.0.0"
+ since_version_write: "18.0.0"
compression-uncompressed:
status: full
compression-brotli:
@@ -97,8 +107,12 @@ support:
status: full
format-bloom-filters:
status: full
+ since_version_read: "18.3.0"
+ since_version_write: "18.3.0"
format-bloom-filter-length:
status: full
+ since_version_read: "18.3.0"
+ since_version_write: "18.3.0"
format-stats-min-max:
status: full
format-page-index:
diff --git a/data/implementations/support/arrow-rs.yaml
b/data/implementations/support/arrow-rs.yaml
index 5873ecc..69b4940 100644
--- a/data/implementations/support/arrow-rs.yaml
+++ b/data/implementations/support/arrow-rs.yaml
@@ -37,6 +37,8 @@ support:
status: full
logical-float16:
status: full
+ since_version_read: "49.0.0"
+ since_version_write: "49.0.0"
logical-date:
status: full
logical-time-int32:
@@ -55,10 +57,16 @@ support:
note: Only supported to use its annotated physical type
logical-variant:
status: full
+ since_version_read: "56.0.0"
+ since_version_write: "56.0.0"
logical-geometry:
status: full
+ since_version_read: "57.0.0"
+ since_version_write: "57.0.0"
logical-geography:
status: full
+ since_version_read: "57.0.0"
+ since_version_write: "57.0.0"
logical-list:
status: full
logical-map:
@@ -84,6 +92,12 @@ support:
status: full
encoding-byte-stream-split:
status: full
+ since_version_read: "52.2.0"
+ since_version_write: "52.2.0"
+ encoding-byte-stream-split-extended:
+ status: full
+ since_version_read: "53.0.0"
+ since_version_write: "53.0.0"
compression-uncompressed:
status: full
compression-brotli:
@@ -112,6 +126,8 @@ support:
status: full
format-modular-encryption:
status: full
+ since_version_read: "54.3.0"
+ since_version_write: "55.0.0"
format-size-statistics:
status: full
format-data-page-v2:
diff --git a/data/implementations/support/arrow.yaml
b/data/implementations/support/arrow.yaml
index 12d9f9e..b70a87e 100644
--- a/data/implementations/support/arrow.yaml
+++ b/data/implementations/support/arrow.yaml
@@ -35,6 +35,8 @@ support:
status: full
logical-float16:
status: full
+ since_version_read: "15.0.0"
+ since_version_write: "15.0.0"
logical-date:
status: full
logical-time-int32:
@@ -47,14 +49,20 @@ support:
status: full
logical-json:
status: full
+ since_version_read: "18.0.0"
+ since_version_write: "18.0.0"
logical-bson:
status: none
logical-variant:
status: unknown
logical-geometry:
status: full
+ since_version_read: "21.0.0"
+ since_version_write: "21.0.0"
logical-geography:
status: full
+ since_version_read: "21.0.0"
+ since_version_write: "21.0.0"
logical-list:
status: full
logical-map:
@@ -79,6 +87,12 @@ support:
status: full
encoding-byte-stream-split:
status: full
+ since_version_read: "16.0.0"
+ since_version_write: "16.0.0"
+ encoding-byte-stream-split-extended:
+ status: full
+ since_version_read: "16.0.0"
+ since_version_write: "16.0.0"
compression-uncompressed:
status: full
compression-brotli:
@@ -97,18 +111,26 @@ support:
status: full
format-bloom-filters:
status: read
+ since_version_read: "15.0.0"
format-bloom-filter-length:
status: read
+ since_version_read: "15.0.0"
format-stats-min-max:
status: full
format-page-index:
status: full
+ since_version_read: "20.0.0"
+ since_version_write: "20.0.0"
format-page-crc32:
status: full
+ since_version_read: "15.0.0"
+ since_version_write: "15.0.0"
format-modular-encryption:
status: full
format-size-statistics:
status: full
+ since_version_read: "19.0.0"
+ since_version_write: "19.0.0"
format-data-page-v2:
status: full
api-external-column-data:
diff --git a/data/implementations/support/cudf.yaml
b/data/implementations/support/cudf.yaml
index 973339e..4c4986a 100644
--- a/data/implementations/support/cudf.yaml
+++ b/data/implementations/support/cudf.yaml
@@ -79,6 +79,8 @@ support:
status: full
encoding-byte-stream-split:
status: full
+ encoding-byte-stream-split-extended:
+ status: unknown
compression-uncompressed:
status: full
compression-brotli:
@@ -97,6 +99,7 @@ support:
status: full
format-bloom-filters:
status: read
+ since_version_read: "25.06.00"
format-bloom-filter-length:
status: read
format-stats-min-max:
@@ -119,6 +122,8 @@ support:
status: full
api-rowgroup-pruning-bloom:
status: full
+ since_version_read: "25.06.00"
+ since_version_write: "25.06.00"
api-column-projection:
status: full
api-page-pruning-stats:
diff --git a/data/implementations/support/duckdb.yaml
b/data/implementations/support/duckdb.yaml
index 8e459b3..6112100 100644
--- a/data/implementations/support/duckdb.yaml
+++ b/data/implementations/support/duckdb.yaml
@@ -35,6 +35,8 @@ support:
status: full
logical-float16:
status: full
+ since_version_read: "1.3.0"
+ since_version_write: "1.3.0"
logical-date:
status: full
logical-time-int32:
@@ -51,10 +53,16 @@ support:
status: none
logical-variant:
status: full
+ since_version_read: "1.4.0"
+ since_version_write: "1.4.0"
logical-geometry:
status: full
+ since_version_read: "1.4.0"
+ since_version_write: "1.4.0"
logical-geography:
status: full
+ since_version_read: "1.4.0"
+ since_version_write: "1.4.0"
logical-list:
status: full
logical-map:
@@ -73,12 +81,18 @@ support:
status: none
encoding-delta-binary-packed:
status: full
+ since_version_read: "1.2.0"
+ since_version_write: "1.2.0"
encoding-delta-length-byte-array:
status: full
encoding-delta-byte-array:
status: full
encoding-byte-stream-split:
status: full
+ encoding-byte-stream-split-extended:
+ status: full
+ since_version_read: "1.2.0"
+ since_version_write: "1.2.0"
compression-uncompressed:
status: full
compression-brotli:
diff --git a/data/implementations/support/hyparquet.yaml
b/data/implementations/support/hyparquet.yaml
index a570dbe..48bfc59 100644
--- a/data/implementations/support/hyparquet.yaml
+++ b/data/implementations/support/hyparquet.yaml
@@ -79,6 +79,8 @@ support:
status: read
encoding-byte-stream-split:
status: read
+ encoding-byte-stream-split-extended:
+ status: unknown
compression-uncompressed:
status: full
compression-brotli:
diff --git a/data/implementations/support/parquet-java.yaml
b/data/implementations/support/parquet-java.yaml
index d6811ee..3430e9a 100644
--- a/data/implementations/support/parquet-java.yaml
+++ b/data/implementations/support/parquet-java.yaml
@@ -55,10 +55,16 @@ support:
note: Only supported to use its annotated physical type
logical-variant:
status: full
+ since_version_read: "1.16.0"
+ since_version_write: "1.16.0"
logical-geometry:
status: full
+ since_version_read: "1.16.0"
+ since_version_write: "1.16.0"
logical-geography:
status: full
+ since_version_read: "1.16.0"
+ since_version_write: "1.16.0"
logical-list:
status: full
logical-map:
@@ -83,6 +89,8 @@ support:
status: full
encoding-byte-stream-split:
status: full
+ encoding-byte-stream-split-extended:
+ status: full
compression-uncompressed:
status: full
compression-brotli:
diff --git a/layouts/shortcodes/implementation-status.html
b/layouts/shortcodes/implementation-status.html
index 3113516..0008c44 100644
--- a/layouts/shortcodes/implementation-status.html
+++ b/layouts/shortcodes/implementation-status.html
@@ -55,7 +55,30 @@
{{- else -}}
{{ .display_name }}
{{- end -}}
-
+
+ {{- /* Render format version inline if present */ -}}
+ {{- if .format_version -}}
+ {{- $year := "" -}}
+ {{- $dateStr := .format_version.date -}}
+ {{- if hasPrefix $dateStr "2025" -}}
+ {{- $year = "2025" -}}
+ {{- else if hasPrefix $dateStr "2024" -}}
+ {{- $year = "2024" -}}
+ {{- else if hasPrefix $dateStr "2023" -}}
+ {{- $year = "2023" -}}
+ {{- else if hasPrefix $dateStr "2020" -}}
+ {{- $year = "2020" -}}
+ {{- else if hasPrefix $dateStr "2019" -}}
+ {{- $year = "2019" -}}
+ {{- else if hasPrefix $dateStr "2018" -}}
+ {{- $year = "2018" -}}
+ {{- else -}}
+ {{- $year = substr $dateStr 0 4 -}}
+ {{- end -}}
+ {{- $releaseUrl := printf
"https://github.com/apache/parquet-format/releases/tag/apache-parquet-format-%s"
.format_version.version -}}
+ <span class="format-version"> (<a href="{{ $releaseUrl }}">{{
$year }}</a>)</span>
+ {{- end -}}
+
{{- if .note -}}
{{- $present := false }}
{{- $noteCounter := 0 -}}
@@ -81,26 +104,28 @@
{{- /* Get support status inline */ -}}
{{- $supportData := index site.Data.implementations.support
$engineId -}}
+ {{- $support := false -}}
{{- $status := "unknown" -}}
{{- $noteHtml := "" -}}
{{- $noteCounter := 0 -}}
{{- $newNote := false -}}
{{- if $supportData -}}
- {{- $support := index $supportData.support $featureId -}}
+ {{- $support = index $supportData.support $featureId -}}
{{- if $support -}}
{{- $status = $support.status -}}
{{- if $support.note -}}
{{- $newNote = true -}}
{{- $present := false }}
+ {{- $currentSupportNote := $support.note -}}
{{- range $noteRowIndex, $noteRow := $noteMap -}}
- {{- $noteStr := $support.note -}}
+ {{- $noteStr := $currentSupportNote -}}
{{- if ne $noteStr (index $noteRow 1) -}}
{{- $noteCounter = add $noteCounter 1 -}}
{{- end -}}
{{- end -}}
{{- if eq $noteCounter (len $noteMap)}}
- {{- $noteRow := slice (cast.ToString $noteCounter)
$support.note $category.id }}
+ {{- $noteRow := slice (cast.ToString $noteCounter)
$currentSupportNote $category.id }}
{{- if eq (len $noteMap) 0 -}}
{{- $noteMap = $noteMap | append (slice $noteRow) -}}
{{- else -}}
@@ -113,8 +138,98 @@
{{- end -}}
{{- $statusInfo := index $legend.symbols $status -}}
+ {{- $releaseNotesUrl := "" -}}
+ {{- $sinceVersion := "" -}}
+ {{- $earlierReleaseNotesUrl := "" -}}
+ {{- $earlierIsRead := false -}}
+
+ {{- /* Determine which version to use based on status */ -}}
+ {{- if $support -}}
+ {{- if eq $status "full" -}}
+ {{- /* For full support, use the max of read and write
versions */ -}}
+ {{- $readVersion := $support.since_version_read -}}
+ {{- $writeVersion := $support.since_version_write -}}
+
+ {{- if and $readVersion $writeVersion -}}
+ {{- /* Find dates to compare */ -}}
+ {{- $readDate := "" -}}
+ {{- $writeDate := "" -}}
+ {{- $currentEngine := . -}}
+
+ {{- /* Get read version date */ -}}
+ {{- $readRelease := index $currentEngine.versions.releases
$readVersion -}}
+ {{- if $readRelease -}}
+ {{- $readDate = $readRelease.release_date -}}
+ {{- end -}}
+
+ {{- /* Get write version date */ -}}
+ {{- $writeRelease := index
$currentEngine.versions.releases $writeVersion -}}
+ {{- if $writeRelease -}}
+ {{- $writeDate = $writeRelease.release_date -}}
+ {{- end -}}
+
+ {{- /* Use the later version, track earlier if different
*/ -}}
+ {{- if and $readDate $writeDate -}}
+ {{- if gt $writeDate $readDate -}}
+ {{- $sinceVersion = $writeVersion -}}
+ {{- if ne $readVersion $writeVersion -}}
+ {{- $earlierReleaseNotesUrl =
$readRelease.release_notes_url -}}
+ {{- $earlierIsRead = true -}}
+ {{- end -}}
+ {{- else if lt $writeDate $readDate -}}
+ {{- $sinceVersion = $readVersion -}}
+ {{- if ne $readVersion $writeVersion -}}
+ {{- $earlierReleaseNotesUrl =
$writeRelease.release_notes_url -}}
+ {{- $earlierIsRead = false -}}
+ {{- end -}}
+ {{- else -}}
+ {{- $sinceVersion = $readVersion -}}
+ {{- end -}}
+ {{- else if $readDate -}}
+ {{- $sinceVersion = $readVersion -}}
+ {{- else if $writeDate -}}
+ {{- $sinceVersion = $writeVersion -}}
+ {{- end -}}
+ {{- else if $readVersion -}}
+ {{- $sinceVersion = $readVersion -}}
+ {{- else if $writeVersion -}}
+ {{- $sinceVersion = $writeVersion -}}
+ {{- end -}}
+ {{- else if eq $status "read" -}}
+ {{- if $support.since_version_read -}}
+ {{- $sinceVersion = $support.since_version_read -}}
+ {{- end -}}
+ {{- else if eq $status "write" -}}
+ {{- if $support.since_version_write -}}
+ {{- $sinceVersion = $support.since_version_write -}}
+ {{- end -}}
+ {{- end -}}
+
+ {{- /* Find the release notes URL for this version */ -}}
+ {{- if $sinceVersion -}}
+ {{- $currentEngine := . -}}
+ {{- $release := index $currentEngine.versions.releases
$sinceVersion -}}
+ {{- if $release -}}
+ {{- $releaseNotesUrl = $release.release_notes_url -}}
+ {{- end -}}
+ {{- end -}}
+ {{- end -}}
+
<td class="{{ $statusInfo.class }}">
- {{ $statusInfo.display }}
+ {{- /* Hyperlink status symbol if release notes URL exists */
-}}
+ {{- if $releaseNotesUrl -}}
+ <a href="{{ $releaseNotesUrl }}">{{ $statusInfo.display
}}</a>
+ {{- /* Add superscript link for earlier version if different
*/ -}}
+ {{- if $earlierReleaseNotesUrl -}}
+ {{- if $earlierIsRead -}}
+ <sup><a href="{{ $earlierReleaseNotesUrl }}">R</a></sup>
+ {{- else -}}
+ <sup><a href="{{ $earlierReleaseNotesUrl }}">W</a></sup>
+ {{- end -}}
+ {{- end -}}
+ {{- else -}}
+ {{ $statusInfo.display }}
+ {{- end -}}
{{- if $newNote -}}
<a href="#note-{{ $category.id }}-{{ $noteCounter }}">({{
add $noteCounter 1 }})</a>
{{- end -}}
@@ -125,7 +240,7 @@
</tbody>
</table>
{{- /* Render footnotes if any */ -}}
- {{- if gt (len $noteMap) 0 -}}
+ {{- if gt (len $noteMap) 0 -}}
<b>Notes:</b>
{{- range $noteRowIndex, $noteRow := $noteMap }}
<div id="note-{{ index $noteRow 2}}-{{index $noteRow 0 }}">({{ add
$noteRowIndex 1}}) {{ index $noteRow 1 }}</div>
@@ -133,3 +248,198 @@
{{- end -}}
{{- end -}}
{{- end -}}
+
+{{- /* Render minimum version table by year */ -}}
+<h3 id="read-support-by-year"><a href="#read-support-by-year">Minimum Version
for Read Support by Year</a></h3>
+<p>This table shows the minimum engine version required to read Parquet files
using features introduced in each year. Only includes compression, encodings,
physical types, and logical types. Features without a specified format version
are assumed to have been added prior to 2023.</p>
+
+<p><b>Note:</b> This data was originally collected in December 2025, and not
all data was backfilled. It is likely older releases of each engine support
reading all features for 2023 and before. As volunteers have time they are
invited to add more granular details on releases. Generally, versions are
expected to be accurate for any year 2025 and after.</p>
+
+{{- /* Collect all features with format_version and group by year */ -}}
+{{- $featuresByYear := dict "2023" (slice) "2024" (slice) "2025" (slice) -}}
+{{- $excludedFeatures := slice "encoding-bit-packed"
"compression-lz4-deprecated" "compression-lzo" "logical-enum" "logical-uuid"
"logical-bson" "logical-json" "logical-interval" -}}
+{{- $includedCategories := slice "compressions" "encodings" "physical-types"
"logical-types" -}}
+
+{{- range $categories -}}
+ {{- $categoryId := .id -}}
+ {{- /* Only include specific categories */ -}}
+ {{- if in $includedCategories $categoryId -}}
+ {{- $featuresData := index site.Data.implementations.features $categoryId
-}}
+ {{- if $featuresData -}}
+ {{- range $featuresData.features -}}
+ {{- $feature := . -}}
+ {{- /* Skip excluded features */ -}}
+ {{- if not (in $excludedFeatures .id) -}}
+ {{- $year := "" -}}
+ {{- if .format_version -}}
+ {{- $dateStr := .format_version.date -}}
+ {{- if hasPrefix $dateStr "2025" -}}
+ {{- $year = "2025" -}}
+ {{- else if hasPrefix $dateStr "2024" -}}
+ {{- $year = "2024" -}}
+ {{- else -}}
+ {{- $year = "2023" -}}
+ {{- end -}}
+ {{- else -}}
+ {{- /* Features without format_version are assumed pre-2023 */ -}}
+ {{- $year = "2023" -}}
+ {{- end -}}
+
+ {{- $currentList := index $featuresByYear $year -}}
+ {{- $featuresByYear = merge $featuresByYear (dict $year
($currentList | append $feature)) -}}
+ {{- end -}}
+ {{- end -}}
+ {{- end -}}
+ {{- end -}}
+{{- end -}}
+
+{{- /* Build list of excluded feature names for display */ -}}
+{{- $excludedFeatureNames := slice -}}
+{{- range $categories -}}
+ {{- $categoryId := .id -}}
+ {{- if in $includedCategories $categoryId -}}
+ {{- $featuresData := index site.Data.implementations.features $categoryId
-}}
+ {{- if $featuresData -}}
+ {{- range $featuresData.features -}}
+ {{- if in $excludedFeatures .id -}}
+ {{- $excludedFeatureNames = $excludedFeatureNames | append
.display_name -}}
+ {{- end -}}
+ {{- end -}}
+ {{- end -}}
+ {{- end -}}
+{{- end -}}
+
+{{- if gt (len $excludedFeatureNames) 0 -}}
+<p><strong>Note:</strong> The following features are excluded from this table:
{{ delimit $excludedFeatureNames ", " }}.</p>
+{{- end -}}
+
+{{- /* Calculate minimum version for each engine and year */ -}}
+<table class="table table-striped">
+ <thead>
+ <tr>
+ <th>Engine</th>
+ <th>≤2023 Features</th>
+ <th>2024 Features</th>
+ <th>2025 Features</th>
+ </tr>
+ </thead>
+ <tbody>
+ {{- range $engines -}}
+ {{- $engine := . -}}
+ {{- $engineId := .id -}}
+ {{- $supportData := index site.Data.implementations.support $engineId -}}
+
+ <tr>
+ <td>{{ .display_name }}</td>
+
+ {{- /* Process each year bucket cumulatively */ -}}
+ {{- $cumulativeMinVersion := "" -}}
+ {{- $cumulativeMinReleaseDate := "" -}}
+ {{- $cumulativeMissingFeatures := slice -}}
+ {{- $hasPriorMissingFeatures := false -}}
+
+ {{- range $year := slice "2023" "2024" "2025" -}}
+ {{- $features := index $featuresByYear $year -}}
+ {{- $minVersion := $cumulativeMinVersion -}}
+ {{- $minReleaseDate := $cumulativeMinReleaseDate -}}
+ {{- $releaseNotesUrl := "" -}}
+ {{- $missingFeatures := slice -}}
+
+ {{- /* If prior years had missing features, carry them forward */ -}}
+ {{- if $hasPriorMissingFeatures -}}
+ {{- $missingFeatures = $cumulativeMissingFeatures -}}
+ {{- end -}}
+
+ {{- /* Find minimum version that supports all features in this year
*/ -}}
+ {{- if $supportData -}}
+ {{- range $features -}}
+ {{- $featureId := .id -}}
+ {{- $support := index $supportData.support $featureId -}}
+
+ {{- /* Check if this feature has full or read support */ -}}
+ {{- if and $support (or (eq $support.status "full") (eq
$support.status "read")) -}}
+ {{- $featureVersion := "" -}}
+ {{- $featureReleaseDate := "" -}}
+
+ {{- /* Use since_version_read if available, otherwise use
default version */ -}}
+ {{- if $support.since_version_read -}}
+ {{- $featureVersion = $support.since_version_read -}}
+
+ {{- /* Find release date for this version */ -}}
+ {{- if and $engine.versions $engine.versions.releases -}}
+ {{- $release := index $engine.versions.releases
$featureVersion -}}
+ {{- if $release -}}
+ {{- $featureReleaseDate = $release.release_date -}}
+ {{- end -}}
+ {{- end -}}
+ {{- else if and $engine.versions $engine.versions.default -}}
+ {{- $featureVersion = $engine.versions.default -}}
+ {{- if $engine.versions.releases -}}
+ {{- $release := index $engine.versions.releases
$featureVersion -}}
+ {{- if $release -}}
+ {{- $featureReleaseDate = $release.release_date -}}
+ {{- end -}}
+ {{- end -}}
+ {{- end -}}
+
+ {{- /* Update minimum if this is later than current minimum */
-}}
+ {{- if $featureVersion -}}
+ {{- if not $minVersion -}}
+ {{- $minVersion = $featureVersion -}}
+ {{- $minReleaseDate = $featureReleaseDate -}}
+ {{- else if and $featureReleaseDate $minReleaseDate -}}
+ {{- if gt $featureReleaseDate $minReleaseDate -}}
+ {{- $minVersion = $featureVersion -}}
+ {{- $minReleaseDate = $featureReleaseDate -}}
+ {{- end -}}
+ {{- end -}}
+ {{- end -}}
+ {{- else -}}
+ {{- /* Feature is not supported or only has write support */
-}}
+ {{- $missingFeatures = $missingFeatures | append .display_name
-}}
+ {{- end -}}
+ {{- end -}}
+
+ {{- /* Find release notes URL for minimum version */ -}}
+ {{- if $minVersion -}}
+ {{- if and $engine.versions $engine.versions.releases -}}
+ {{- $release := index $engine.versions.releases $minVersion -}}
+ {{- if $release -}}
+ {{- $releaseNotesUrl = $release.release_notes_url -}}
+ {{- end -}}
+ {{- end -}}
+ {{- end -}}
+ {{- end -}}
+
+ {{- /* Update cumulative state for next iteration */ -}}
+ {{- $cumulativeMinVersion = $minVersion -}}
+ {{- $cumulativeMinReleaseDate = $minReleaseDate -}}
+ {{- if gt (len $missingFeatures) 0 -}}
+ {{- $hasPriorMissingFeatures = true -}}
+ {{- $cumulativeMissingFeatures = $missingFeatures -}}
+ {{- end -}}
+
+ <td>
+ {{- if gt (len $missingFeatures) 0 -}}
+ {{- /* Has missing features - show X with tooltip */ -}}
+ {{- $tooltip := delimit $missingFeatures ", " -}}
+ <span class="status-none" title="Missing: {{ $tooltip
}}">❌</span>
+ {{- else if $minVersion -}}
+ {{- /* Has full support - show version */ -}}
+ {{- if $releaseNotesUrl -}}
+ <a href="{{ $releaseNotesUrl }}">{{ $minVersion }}</a>
+ {{- else -}}
+ {{ $minVersion }}
+ {{- end -}}
+ {{- if $minReleaseDate -}}
+ <br><small>({{ $minReleaseDate }})</small>
+ {{- end -}}
+ {{- else -}}
+ -
+ {{- end -}}
+ </td>
+ {{- end -}}
+ </tr>
+ {{- end -}}
+ </tbody>
+</table>