Skip to content

Make format version pages data driven#189

Merged
alamb merged 11 commits into
apache:productionfrom
alamb:alamb/data_driven_features
Jul 7, 2026
Merged

Make format version pages data driven#189
alamb merged 11 commits into
apache:productionfrom
alamb:alamb/data_driven_features

Conversation

@alamb

@alamb alamb commented Jun 24, 2026

Copy link
Copy Markdown
Collaborator

Follow on to

Rendered Preview:

Rationale

Implements @emkornfield 's request in #186 (comment)

could we somehow integrate this as YAML data + rendering like we do for feature compatibility?

Among other things, rendering the page using data files forces it to remain consistent with the implementation status page.

Changes

Updates the Parquet format version and implementation status pages to generate their feature tables from structured data under data/implementations.

Planned follow on

Making this change already shows value -- some features only on the versions page but not the implementation status page

This PR simply ignores rows that have implementation_status: false on the implementation status page

As a follow on PR, I will propose adding the new features to the implementation status page, but this PR is already quite large

Examples:

  • logical-type-union
  • logical-nanosecond-time-timestamp
  • logical-variant-shredding
  • format-data-page-v1
  • format-geospatial-statistics
  • format-binary-protocol-extensions
  • format-ieee-754-total-order-and-nan-counts

* [polars](https://github.com/pola-rs/polars) (Rust)

<!-- Status source in data/implementations -->
<!-- Data driven table, see /layouts/shortcodes -->

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I added a readme and new link in layouts/shortcodes


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

| Feature | Released in | Source | Notes |

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The point of the PR is to automatically derive this table from the .yml files

- id: compression-uncompressed
display_name: UNCOMPRESSED

compatibility: forward_incompatible

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I added the various fields needed for the version page to the existing data files. I could probably make this less verbose by automatically generating the urls, but I think this is clearer and easier to understand

- 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:

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

some features already had a "format_version" which was redundant with the information from the versions page, so I consolidated them into the same fields

From

    format_version:
      version: "2.11.0"
      date: "2024-03-21"

To

    released_in: 2.11.0
    release_date: '2024-03-21'

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

my one concern is 2.11.0, interpretted properly as a string without quote marks?

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Good idea -- I quoted them all in commit 9f8d58a

@@ -0,0 +1,15 @@
# Hugo shortcodes

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I found the whole hugo rendering thing new, so I also left some small documentation

@alamb alamb marked this pull request as ready for review June 24, 2026 16:33
@etseidl

etseidl commented Jun 24, 2026

Copy link
Copy Markdown
Contributor

Thanks @alamb, this is neat! One thing occurred to me while verifying external links...it would be nice for the features to link to their specific PR. The current "Source" column links to all changes between versions, so there's a lot of housekeeping changes to wade through.

Not for now, but as a follow-on.

display_name: 8, 16, 32, 64 bit signed and unsigned INT

version_display_name: Signed and unsigned integer logical types (INT32, INT64)
compatibility: forward_compatible

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think this is incompatible?

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

negative physical values are interpetted incorrectly?

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think we've agreed that new logical types are forward compatible.

New logical types are considered forward compatible despite the loss of semantic meaning.

https://github.com/apache/parquet-format/blob/master/CONTRIBUTING.md#compatibility-and-feature-enablement

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yeah, this is broader discussion, I think we should clarify the wording here. we can leave it as is, but I worry about the difference between different semantics:

  1. Losing information that a int64 represents a timestamp is fine in my mind. It still looks like an integer, and following arithmetic properties.
  2. Losing information that an int64 is actually a uint64 feels like a data corruption case.

But I'd have to clarify my thinking here a bit more. We don't need to make the change here.

- id: logical-decimal-int64
display_name: DECIMAL (INT64)

compatibility: forward_compatible

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

technically incompatible. numbers cannot be understood properly without scale?

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Same comment as #189 (comment) applies, not a blocker.

Comment thread layouts/shortcodes/format-versions.html Outdated
{{- $featureUrl = $feature.spec_url -}}
{{- end -}}
{{- $releasedIn := printf "%v" $feature.released_in -}}
{{- $legacyReleaseTags := slice "1.0.0" "2.0.0" "2.1.0" -}}

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

what does the slice do here?

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Apparently in hugo makes an array -- this is part of some overly complicated logic to translate release names like 1.0.0 into tag names (whose format changed over time)

I simplified the whole thing by changing this to a lookup table -- which simplifies this logic and I think makes it clearer what is going on

<tbody>
{{- range $features -}}
{{- /* Include rows by default; skip rows explicitly marked implementation_status: false. */ -}}
{{- if ne .implementation_status false -}}

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thank you for checking this.

@emkornfield emkornfield left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Overall, looks good to me, I think some of the logical changes are actually forward incompatible but that might be a broader conversation on what exactly is compatible/incompatible with them.

Thank you for doing this.

@alamb alamb left a comment

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thank you @etseidl and @emkornfield

I reworked the rendering to

  1. use a table for each parquet format release to avoid fancy rendering logic
  2. restore a Notes column
  3. quoted the version numbers

I have also re-generated the rendered preview https://alamb.github.io/parquet-site/docs/file-format/versions/

I think there are two follow ons here:

  1. Figure out what to do with the features that are in parquet-format but don't have entry on implementation status: https://github.com/apache/parquet-site/pull/189/changes#r3470611445
  2. @etseidl 's suggestion to research the approving PRs #189 (comment) (I'll do this as a follow on PR)

Stuff I am not really sure how to proceed:

Comment thread layouts/shortcodes/format-versions.html Outdated
{{- $featureUrl = $feature.spec_url -}}
{{- end -}}
{{- $releasedIn := printf "%v" $feature.released_in -}}
{{- $legacyReleaseTags := slice "1.0.0" "2.0.0" "2.1.0" -}}

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Apparently in hugo makes an array -- this is part of some overly complicated logic to translate release names like 1.0.0 into tag names (whose format changed over time)

I simplified the whole thing by changing this to a lookup table -- which simplifies this logic and I think makes it clearer what is going on

- 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:

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Good idea -- I quoted them all in commit 9f8d58a

@emkornfield

emkornfield commented Jun 26, 2026

Copy link
Copy Markdown
Contributor

Figure out what to do with the features that are in parquet-format but don't have entry on implementation status: https://github.com/apache/parquet-site/pull/189/changes#r3470611445

Honestly I think most of these are so old, that it doesn't necessary add value, other then maybe providing a note on that page? Is there anything worth surfacing?

Looking more closely, these seem to be the modern ones:

  • logical-variant-shredding - should be covered under variant type support? But maybe called out separately
  • format-geospatial-statistics - should be covered under geospatial support? But maybe called out separately
  • format-binary-protocol-extensions - Not clear if this is actually something on its own without a defined footer we want to use?
  • format-ieee-754-total-order-and-nan-counts - This should be added (and we would ideally add a 2026 feature column for read support).

@emkornfield 's comment in https://github.com/apache/parquet-site/pull/189/changes#r3470700287 about what actually constitutes "forward compatible" -- I think this is a larger consensus building exercise so I would like to not address it in this PR

Yeah, I have a feeling this might come up in the context of versioning conversations no need to block.

@alamb

alamb commented Jun 26, 2026

Copy link
Copy Markdown
Collaborator Author

Looking more closely, these seem to be the modern ones:

I will try and address it in a follow on PR

@etseidl

etseidl commented Jun 26, 2026

Copy link
Copy Markdown
Contributor

2. @etseidl 's suggestion to research the approving PRs #189 (comment) (I'll do this as a follow on PR)

I certainly didn't mean to task you 😉. I'd be happy to compile the data...I'd just need rendering help.

@alamb

alamb commented Jun 26, 2026

Copy link
Copy Markdown
Collaborator Author
  1. @etseidl 's suggestion to research the approving PRs #189 (comment) (I'll do this as a follow on PR)

I certainly didn't mean to task you 😉. I'd be happy to compile the data...I'd just need rendering help.

Oh no problem -- I'll send an agent to do it and then verify. Your help will be most useful in helping to review it as well

@alamb

alamb commented Jul 1, 2026

Copy link
Copy Markdown
Collaborator Author

I think I have addressed all feedback in this PR -- so I will plan to merge it in tomorrow unless people would like more time or have other comments. I'll also file tickets to track follow on work

@alamb alamb merged commit 09e2b29 into apache:production Jul 7, 2026
1 check passed
@alamb

alamb commented Jul 7, 2026

Copy link
Copy Markdown
Collaborator Author
  1. @etseidl 's suggestion to research the approving PRs #189 (comment) (I'll do this as a follow on PR)

I certainly didn't mean to task you 😉. I'd be happy to compile the data...I'd just need rendering help.

Oh no problem -- I'll send an agent to do it and then verify. Your help will be most useful in helping to review it as well

@alamb

alamb commented Jul 7, 2026

Copy link
Copy Markdown
Collaborator Author

Looking more closely, these seem to be the modern ones:

I will try and address it in a follow on PR

Tracking in

@alamb

alamb commented Jul 7, 2026

Copy link
Copy Markdown
Collaborator Author

@etseidl here is a PR to add the PR research

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants