RFC: Encode parquet-format minor_version in thrift metadata - #581

Draft
alamb wants to merge 2 commits into
apache:masterfrom
alamb:alamb/parquet-versions-option-1
Draft

RFC: Encode parquet-format minor_version in thrift metadata#581
alamb wants to merge 2 commits into
apache:masterfrom
alamb:alamb/parquet-versions-option-1

Conversation

@alamb

@alambalamb commented Jun 9, 2026

Copy link
Copy Markdown
Contributor

Rationale for this change

NOTE: there is an alternate RFC here

As described on the mailing list thread about versions, there is currently no way for a parquet reader to know which if the many parquet features it may encounter in a partcular file

The current version field in the thirft metadata is insufficient because:
2. There is no agreed upon definition of version and many writers use it incorrectly:

* As of December 2025, there is no agreed upon consensus of what constitutes
* version 2 of the file. For maximum compatibility with readers, writers should
* always populate "1" for version. For maximum compatibility with writers,
* readers should accept "1" and "2" interchangeably. All other versions are
* reserved for potential future use-cases.
*/

  1. Even if we agreed to use the version field, version "2" has several forward incompatible changes (see Document Parquet Features by Version parquet-site#186) meaning a reader doesn't know what features it may encounter

What changes are included in this PR?

Add a minor_version field to the thrift metadata to encode the minor version of parquet-format. Readers can use this field to determine what features it may encounter.

This field would be ignored by older readers

Do these changes have PoC implementations?

Not yet

* minor versions. See the documentation[1] for more details on the versioning
* scheme and the features added in each version.
*
* [1]: http://parquet.apache.org/docs/file-format/versions

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

This URL would correspond to apache/parquet-site#186 when published

@etseidl

Copy link
Copy Markdown
Contributor

My issue with this (and #582) is that the version info (here the minor, there both major and minor), are encoded after the entirety of the metadata. Readers will have to decode the entire footer to obtain adequate versioning info.

The current version is an i32, why waste that on a single digit? We can encode a year based version as a decimal integer 202606. Or if we want SemVer something like 2013000 (for 2.13.0). Or, for just major/minor we could split the i32 into two i16s (0x2000D).

The advantage to keeping the current version field is that it will be the first thing encoded. You don't need a custom thrift decoder to examine a single VLQ encoded integer. Readers can then check the version before passing the footer bytes on to whatever thrift decoder they're using.

@alamb

alamb commented Jun 9, 2026

Copy link
Copy Markdown
ContributorAuthor

The current version is an i32, why waste that on a single digit? We can encode a year based version as a decimal integer 202606. Or if we want SemVer something like 2013000 (for 2.13.0). Or, for just major/minor we could split the i32 into two i16s (0x2000D).

I agree that is a more clever encoding. I was trying to find something that was backwards compatible and avoids the "what does the version field mean" discussion, that no one seems able to resolve

🤷

Sign up for freeto 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.

2 participants

@alamb@etseidl
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

RFC: Encode parquet-format minor_version in thrift metadata - #581

Draft
alamb wants to merge 2 commits into
apache:masterfrom
alamb:alamb/parquet-versions-option-1
Draft

RFC: Encode parquet-format minor_version in thrift metadata#581
alamb wants to merge 2 commits into
apache:masterfrom
alamb:alamb/parquet-versions-option-1

Conversation

@alamb

@alambalamb commented Jun 9, 2026

Copy link
Copy Markdown
Contributor

Rationale for this change

NOTE: there is an alternate RFC here

As described on the mailing list thread about versions, there is currently no way for a parquet reader to know which if the many parquet features it may encounter in a partcular file

The current version field in the thirft metadata is insufficient because:
2. There is no agreed upon definition of version and many writers use it incorrectly:

* As of December 2025, there is no agreed upon consensus of what constitutes
* version 2 of the file. For maximum compatibility with readers, writers should
* always populate "1" for version. For maximum compatibility with writers,
* readers should accept "1" and "2" interchangeably. All other versions are
* reserved for potential future use-cases.
*/

  1. Even if we agreed to use the version field, version "2" has several forward incompatible changes (see Document Parquet Features by Version parquet-site#186) meaning a reader doesn't know what features it may encounter

What changes are included in this PR?

Add a minor_version field to the thrift metadata to encode the minor version of parquet-format. Readers can use this field to determine what features it may encounter.

This field would be ignored by older readers

Do these changes have PoC implementations?

Not yet

* minor versions. See the documentation[1] for more details on the versioning
* scheme and the features added in each version.
*
* [1]: http://parquet.apache.org/docs/file-format/versions

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

This URL would correspond to apache/parquet-site#186 when published

@etseidl

Copy link
Copy Markdown
Contributor

My issue with this (and #582) is that the version info (here the minor, there both major and minor), are encoded after the entirety of the metadata. Readers will have to decode the entire footer to obtain adequate versioning info.

The current version is an i32, why waste that on a single digit? We can encode a year based version as a decimal integer 202606. Or if we want SemVer something like 2013000 (for 2.13.0). Or, for just major/minor we could split the i32 into two i16s (0x2000D).

The advantage to keeping the current version field is that it will be the first thing encoded. You don't need a custom thrift decoder to examine a single VLQ encoded integer. Readers can then check the version before passing the footer bytes on to whatever thrift decoder they're using.

@alamb

alamb commented Jun 9, 2026

Copy link
Copy Markdown
ContributorAuthor

The current version is an i32, why waste that on a single digit? We can encode a year based version as a decimal integer 202606. Or if we want SemVer something like 2013000 (for 2.13.0). Or, for just major/minor we could split the i32 into two i16s (0x2000D).

I agree that is a more clever encoding. I was trying to find something that was backwards compatible and avoids the "what does the version field mean" discussion, that no one seems able to resolve

🤷

Sign up for freeto 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.

2 participants

@alamb@etseidl
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

RFC: Encode parquet-format minor_version in thrift metadata - #581

Draft
alamb wants to merge 2 commits into
apache:masterfrom
alamb:alamb/parquet-versions-option-1
Draft

RFC: Encode parquet-format minor_version in thrift metadata#581
alamb wants to merge 2 commits into
apache:masterfrom
alamb:alamb/parquet-versions-option-1

Conversation

@alamb

@alambalamb commented Jun 9, 2026

Copy link
Copy Markdown
Contributor

Rationale for this change

NOTE: there is an alternate RFC here

As described on the mailing list thread about versions, there is currently no way for a parquet reader to know which if the many parquet features it may encounter in a partcular file

The current version field in the thirft metadata is insufficient because:
2. There is no agreed upon definition of version and many writers use it incorrectly:

* As of December 2025, there is no agreed upon consensus of what constitutes
* version 2 of the file. For maximum compatibility with readers, writers should
* always populate "1" for version. For maximum compatibility with writers,
* readers should accept "1" and "2" interchangeably. All other versions are
* reserved for potential future use-cases.
*/

  1. Even if we agreed to use the version field, version "2" has several forward incompatible changes (see Document Parquet Features by Version parquet-site#186) meaning a reader doesn't know what features it may encounter

What changes are included in this PR?

Add a minor_version field to the thrift metadata to encode the minor version of parquet-format. Readers can use this field to determine what features it may encounter.

This field would be ignored by older readers

Do these changes have PoC implementations?

Not yet

* minor versions. See the documentation[1] for more details on the versioning
* scheme and the features added in each version.
*
* [1]: http://parquet.apache.org/docs/file-format/versions

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

This URL would correspond to apache/parquet-site#186 when published

@etseidl

Copy link
Copy Markdown
Contributor

My issue with this (and #582) is that the version info (here the minor, there both major and minor), are encoded after the entirety of the metadata. Readers will have to decode the entire footer to obtain adequate versioning info.

The current version is an i32, why waste that on a single digit? We can encode a year based version as a decimal integer 202606. Or if we want SemVer something like 2013000 (for 2.13.0). Or, for just major/minor we could split the i32 into two i16s (0x2000D).

The advantage to keeping the current version field is that it will be the first thing encoded. You don't need a custom thrift decoder to examine a single VLQ encoded integer. Readers can then check the version before passing the footer bytes on to whatever thrift decoder they're using.

@alamb

alamb commented Jun 9, 2026

Copy link
Copy Markdown
ContributorAuthor

The current version is an i32, why waste that on a single digit? We can encode a year based version as a decimal integer 202606. Or if we want SemVer something like 2013000 (for 2.13.0). Or, for just major/minor we could split the i32 into two i16s (0x2000D).

I agree that is a more clever encoding. I was trying to find something that was backwards compatible and avoids the "what does the version field mean" discussion, that no one seems able to resolve

🤷

Sign up for freeto 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.

2 participants

@alamb@etseidl
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

RFC: Encode parquet-format minor_version in thrift metadata - #581

Draft
alamb wants to merge 2 commits into
apache:masterfrom
alamb:alamb/parquet-versions-option-1
Draft

RFC: Encode parquet-format minor_version in thrift metadata#581
alamb wants to merge 2 commits into
apache:masterfrom
alamb:alamb/parquet-versions-option-1

Conversation

@alamb

@alambalamb commented Jun 9, 2026

Copy link
Copy Markdown
Contributor

Rationale for this change

NOTE: there is an alternate RFC here

As described on the mailing list thread about versions, there is currently no way for a parquet reader to know which if the many parquet features it may encounter in a partcular file

The current version field in the thirft metadata is insufficient because:
2. There is no agreed upon definition of version and many writers use it incorrectly:

* As of December 2025, there is no agreed upon consensus of what constitutes
* version 2 of the file. For maximum compatibility with readers, writers should
* always populate "1" for version. For maximum compatibility with writers,
* readers should accept "1" and "2" interchangeably. All other versions are
* reserved for potential future use-cases.
*/

  1. Even if we agreed to use the version field, version "2" has several forward incompatible changes (see Document Parquet Features by Version parquet-site#186) meaning a reader doesn't know what features it may encounter

What changes are included in this PR?

Add a minor_version field to the thrift metadata to encode the minor version of parquet-format. Readers can use this field to determine what features it may encounter.

This field would be ignored by older readers

Do these changes have PoC implementations?

Not yet

* minor versions. See the documentation[1] for more details on the versioning
* scheme and the features added in each version.
*
* [1]: http://parquet.apache.org/docs/file-format/versions

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

This URL would correspond to apache/parquet-site#186 when published

@etseidl

Copy link
Copy Markdown
Contributor

My issue with this (and #582) is that the version info (here the minor, there both major and minor), are encoded after the entirety of the metadata. Readers will have to decode the entire footer to obtain adequate versioning info.

The current version is an i32, why waste that on a single digit? We can encode a year based version as a decimal integer 202606. Or if we want SemVer something like 2013000 (for 2.13.0). Or, for just major/minor we could split the i32 into two i16s (0x2000D).

The advantage to keeping the current version field is that it will be the first thing encoded. You don't need a custom thrift decoder to examine a single VLQ encoded integer. Readers can then check the version before passing the footer bytes on to whatever thrift decoder they're using.

@alamb

alamb commented Jun 9, 2026

Copy link
Copy Markdown
ContributorAuthor

The current version is an i32, why waste that on a single digit? We can encode a year based version as a decimal integer 202606. Or if we want SemVer something like 2013000 (for 2.13.0). Or, for just major/minor we could split the i32 into two i16s (0x2000D).

I agree that is a more clever encoding. I was trying to find something that was backwards compatible and avoids the "what does the version field mean" discussion, that no one seems able to resolve

🤷

Sign up for freeto 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.

2 participants

@alamb@etseidl
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

RFC: Encode parquet-format minor_version in thrift metadata - #581

Draft
alamb wants to merge 2 commits into
apache:masterfrom
alamb:alamb/parquet-versions-option-1
Draft

RFC: Encode parquet-format minor_version in thrift metadata#581
alamb wants to merge 2 commits into
apache:masterfrom
alamb:alamb/parquet-versions-option-1

Conversation

@alamb

@alambalamb commented Jun 9, 2026

Copy link
Copy Markdown
Contributor

Rationale for this change

NOTE: there is an alternate RFC here

As described on the mailing list thread about versions, there is currently no way for a parquet reader to know which if the many parquet features it may encounter in a partcular file

The current version field in the thirft metadata is insufficient because:
2. There is no agreed upon definition of version and many writers use it incorrectly:

* As of December 2025, there is no agreed upon consensus of what constitutes
* version 2 of the file. For maximum compatibility with readers, writers should
* always populate "1" for version. For maximum compatibility with writers,
* readers should accept "1" and "2" interchangeably. All other versions are
* reserved for potential future use-cases.
*/

  1. Even if we agreed to use the version field, version "2" has several forward incompatible changes (see Document Parquet Features by Version parquet-site#186) meaning a reader doesn't know what features it may encounter

What changes are included in this PR?

Add a minor_version field to the thrift metadata to encode the minor version of parquet-format. Readers can use this field to determine what features it may encounter.

This field would be ignored by older readers

Do these changes have PoC implementations?

Not yet

* minor versions. See the documentation[1] for more details on the versioning
* scheme and the features added in each version.
*
* [1]: http://parquet.apache.org/docs/file-format/versions

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

This URL would correspond to apache/parquet-site#186 when published

@etseidl

Copy link
Copy Markdown
Contributor

My issue with this (and #582) is that the version info (here the minor, there both major and minor), are encoded after the entirety of the metadata. Readers will have to decode the entire footer to obtain adequate versioning info.

The current version is an i32, why waste that on a single digit? We can encode a year based version as a decimal integer 202606. Or if we want SemVer something like 2013000 (for 2.13.0). Or, for just major/minor we could split the i32 into two i16s (0x2000D).

The advantage to keeping the current version field is that it will be the first thing encoded. You don't need a custom thrift decoder to examine a single VLQ encoded integer. Readers can then check the version before passing the footer bytes on to whatever thrift decoder they're using.

@alamb

alamb commented Jun 9, 2026

Copy link
Copy Markdown
ContributorAuthor

The current version is an i32, why waste that on a single digit? We can encode a year based version as a decimal integer 202606. Or if we want SemVer something like 2013000 (for 2.13.0). Or, for just major/minor we could split the i32 into two i16s (0x2000D).

I agree that is a more clever encoding. I was trying to find something that was backwards compatible and avoids the "what does the version field mean" discussion, that no one seems able to resolve

🤷

Sign up for freeto 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.

2 participants

@alamb@etseidl
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

RFC: Encode parquet-format minor_version in thrift metadata - #581

Draft
alamb wants to merge 2 commits into
apache:masterfrom
alamb:alamb/parquet-versions-option-1
Draft

RFC: Encode parquet-format minor_version in thrift metadata#581
alamb wants to merge 2 commits into
apache:masterfrom
alamb:alamb/parquet-versions-option-1

Conversation

@alamb

@alambalamb commented Jun 9, 2026

Copy link
Copy Markdown
Contributor

Rationale for this change

NOTE: there is an alternate RFC here

As described on the mailing list thread about versions, there is currently no way for a parquet reader to know which if the many parquet features it may encounter in a partcular file

The current version field in the thirft metadata is insufficient because:
2. There is no agreed upon definition of version and many writers use it incorrectly:

* As of December 2025, there is no agreed upon consensus of what constitutes
* version 2 of the file. For maximum compatibility with readers, writers should
* always populate "1" for version. For maximum compatibility with writers,
* readers should accept "1" and "2" interchangeably. All other versions are
* reserved for potential future use-cases.
*/

  1. Even if we agreed to use the version field, version "2" has several forward incompatible changes (see Document Parquet Features by Version parquet-site#186) meaning a reader doesn't know what features it may encounter

What changes are included in this PR?

Add a minor_version field to the thrift metadata to encode the minor version of parquet-format. Readers can use this field to determine what features it may encounter.

This field would be ignored by older readers

Do these changes have PoC implementations?

Not yet

* minor versions. See the documentation[1] for more details on the versioning
* scheme and the features added in each version.
*
* [1]: http://parquet.apache.org/docs/file-format/versions

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

This URL would correspond to apache/parquet-site#186 when published

@etseidl

Copy link
Copy Markdown
Contributor

My issue with this (and #582) is that the version info (here the minor, there both major and minor), are encoded after the entirety of the metadata. Readers will have to decode the entire footer to obtain adequate versioning info.

The current version is an i32, why waste that on a single digit? We can encode a year based version as a decimal integer 202606. Or if we want SemVer something like 2013000 (for 2.13.0). Or, for just major/minor we could split the i32 into two i16s (0x2000D).

The advantage to keeping the current version field is that it will be the first thing encoded. You don't need a custom thrift decoder to examine a single VLQ encoded integer. Readers can then check the version before passing the footer bytes on to whatever thrift decoder they're using.

@alamb

alamb commented Jun 9, 2026

Copy link
Copy Markdown
ContributorAuthor

The current version is an i32, why waste that on a single digit? We can encode a year based version as a decimal integer 202606. Or if we want SemVer something like 2013000 (for 2.13.0). Or, for just major/minor we could split the i32 into two i16s (0x2000D).

I agree that is a more clever encoding. I was trying to find something that was backwards compatible and avoids the "what does the version field mean" discussion, that no one seems able to resolve

🤷

Sign up for freeto 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.

2 participants

@alamb@etseidl
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

RFC: Encode parquet-format minor_version in thrift metadata - #581

Draft
alamb wants to merge 2 commits into
apache:masterfrom
alamb:alamb/parquet-versions-option-1
Draft

RFC: Encode parquet-format minor_version in thrift metadata#581
alamb wants to merge 2 commits into
apache:masterfrom
alamb:alamb/parquet-versions-option-1

Conversation

@alamb

@alambalamb commented Jun 9, 2026

Copy link
Copy Markdown
Contributor

Rationale for this change

NOTE: there is an alternate RFC here

As described on the mailing list thread about versions, there is currently no way for a parquet reader to know which if the many parquet features it may encounter in a partcular file

The current version field in the thirft metadata is insufficient because:
2. There is no agreed upon definition of version and many writers use it incorrectly:

* As of December 2025, there is no agreed upon consensus of what constitutes
* version 2 of the file. For maximum compatibility with readers, writers should
* always populate "1" for version. For maximum compatibility with writers,
* readers should accept "1" and "2" interchangeably. All other versions are
* reserved for potential future use-cases.
*/

  1. Even if we agreed to use the version field, version "2" has several forward incompatible changes (see Document Parquet Features by Version parquet-site#186) meaning a reader doesn't know what features it may encounter

What changes are included in this PR?

Add a minor_version field to the thrift metadata to encode the minor version of parquet-format. Readers can use this field to determine what features it may encounter.

This field would be ignored by older readers

Do these changes have PoC implementations?

Not yet

* minor versions. See the documentation[1] for more details on the versioning
* scheme and the features added in each version.
*
* [1]: http://parquet.apache.org/docs/file-format/versions

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

This URL would correspond to apache/parquet-site#186 when published

@etseidl

Copy link
Copy Markdown
Contributor

My issue with this (and #582) is that the version info (here the minor, there both major and minor), are encoded after the entirety of the metadata. Readers will have to decode the entire footer to obtain adequate versioning info.

The current version is an i32, why waste that on a single digit? We can encode a year based version as a decimal integer 202606. Or if we want SemVer something like 2013000 (for 2.13.0). Or, for just major/minor we could split the i32 into two i16s (0x2000D).

The advantage to keeping the current version field is that it will be the first thing encoded. You don't need a custom thrift decoder to examine a single VLQ encoded integer. Readers can then check the version before passing the footer bytes on to whatever thrift decoder they're using.

@alamb

alamb commented Jun 9, 2026

Copy link
Copy Markdown
ContributorAuthor

The current version is an i32, why waste that on a single digit? We can encode a year based version as a decimal integer 202606. Or if we want SemVer something like 2013000 (for 2.13.0). Or, for just major/minor we could split the i32 into two i16s (0x2000D).

I agree that is a more clever encoding. I was trying to find something that was backwards compatible and avoids the "what does the version field mean" discussion, that no one seems able to resolve

🤷

Sign up for freeto 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.

2 participants

@alamb@etseidl
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

RFC: Encode parquet-format minor_version in thrift metadata - #581

Draft
alamb wants to merge 2 commits into
apache:masterfrom
alamb:alamb/parquet-versions-option-1
Draft

RFC: Encode parquet-format minor_version in thrift metadata#581
alamb wants to merge 2 commits into
apache:masterfrom
alamb:alamb/parquet-versions-option-1

Conversation

@alamb

@alambalamb commented Jun 9, 2026

Copy link
Copy Markdown
Contributor

Rationale for this change

NOTE: there is an alternate RFC here

As described on the mailing list thread about versions, there is currently no way for a parquet reader to know which if the many parquet features it may encounter in a partcular file

The current version field in the thirft metadata is insufficient because:
2. There is no agreed upon definition of version and many writers use it incorrectly:

* As of December 2025, there is no agreed upon consensus of what constitutes
* version 2 of the file. For maximum compatibility with readers, writers should
* always populate "1" for version. For maximum compatibility with writers,
* readers should accept "1" and "2" interchangeably. All other versions are
* reserved for potential future use-cases.
*/

  1. Even if we agreed to use the version field, version "2" has several forward incompatible changes (see Document Parquet Features by Version parquet-site#186) meaning a reader doesn't know what features it may encounter

What changes are included in this PR?

Add a minor_version field to the thrift metadata to encode the minor version of parquet-format. Readers can use this field to determine what features it may encounter.

This field would be ignored by older readers

Do these changes have PoC implementations?

Not yet

* minor versions. See the documentation[1] for more details on the versioning
* scheme and the features added in each version.
*
* [1]: http://parquet.apache.org/docs/file-format/versions

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

This URL would correspond to apache/parquet-site#186 when published

@etseidl

Copy link
Copy Markdown
Contributor

My issue with this (and #582) is that the version info (here the minor, there both major and minor), are encoded after the entirety of the metadata. Readers will have to decode the entire footer to obtain adequate versioning info.

The current version is an i32, why waste that on a single digit? We can encode a year based version as a decimal integer 202606. Or if we want SemVer something like 2013000 (for 2.13.0). Or, for just major/minor we could split the i32 into two i16s (0x2000D).

The advantage to keeping the current version field is that it will be the first thing encoded. You don't need a custom thrift decoder to examine a single VLQ encoded integer. Readers can then check the version before passing the footer bytes on to whatever thrift decoder they're using.

@alamb

alamb commented Jun 9, 2026

Copy link
Copy Markdown
ContributorAuthor

The current version is an i32, why waste that on a single digit? We can encode a year based version as a decimal integer 202606. Or if we want SemVer something like 2013000 (for 2.13.0). Or, for just major/minor we could split the i32 into two i16s (0x2000D).

I agree that is a more clever encoding. I was trying to find something that was backwards compatible and avoids the "what does the version field mean" discussion, that no one seems able to resolve

🤷

Sign up for freeto 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.

2 participants

@alamb@etseidl