This is an automated email from the ASF dual-hosted git repository.

jamesbognar pushed a commit to branch docs
in repository https://gitbox.apache.org/repos/asf/juneau.git


The following commit(s) were added to refs/heads/docs by this push:
     new fe30245f80 feat(marshall): Parquet external-read interop 
(multi-page/row-group, dictionary, Snappy) + binary-native logical types
fe30245f80 is described below

commit fe30245f808c3492ff27c71a47611bda25a1ca85
Author: James Bognar <[email protected]>
AuthorDate: Wed Jun 17 14:18:26 2026 -0400

    feat(marshall): Parquet external-read interop (multi-page/row-group, 
dictionary, Snappy) + binary-native logical types
---
 pages/release-notes/10.0.0.md          | 22 ++++++++++++++++++++++
 pages/topics/02.34.06.ParquetBasics.md | 34 ++++++++++++++++++++++++++++++++++
 static/ai/juneau-knowledge.jsonl       |  2 +-
 static/ai/manifest.json                |  4 ++--
 4 files changed, 59 insertions(+), 3 deletions(-)

diff --git a/pages/release-notes/10.0.0.md b/pages/release-notes/10.0.0.md
index c3dd7308d6..e7e72c4530 100644
--- a/pages/release-notes/10.0.0.md
+++ b/pages/release-notes/10.0.0.md
@@ -379,6 +379,28 @@ annotation.
 See the new [Protobuf Binary Format Basics](/docs/topics/ProtobufBinaryBasics) 
topic page for the full
 scalar/container mapping tables, field-number rules, and round-trip guarantees.
 
+#### Parquet external-read interop + binary-native logical types
+
+Juneau 10.0 extends the Parquet codec to read spec-compliant files produced by 
external writers
+(parquet-mr / Spark / Hive), not just files Juneau itself emits, and to 
understand the binary-native
+logical types those tools use.
+
+- **External-read fidelity** — the reader now handles **multi-page** column 
chunks, **multi-row-group**
+  files, and **dictionary-encoded** pages (`DICTIONARY_PAGE` + 
`PLAIN_DICTIONARY`/`RLE_DICTIONARY`, the
+  parquet-mr default). Previously only the single-page / single-row-group / 
PLAIN shape Juneau wrote was
+  readable.
+- **Snappy decompression** — a built-in, dependency-free Snappy **block** 
decoder reads Snappy-compressed
+  pages (the default Spark/parquet-mr compression). Decode-only; write stays 
`UNCOMPRESSED`/`GZIP`. LZ4 /
+  Zstd / Brotli / LZO remain hard errors (no silent fallback).
+- **Binary-native logical types** — INT96 timestamps, DECIMAL 
(INT32/INT64-backed, scale-aware),
+  DATE, TIME(micros), and TIMESTAMP(micros) are always decoded on read. On 
write they are opt-in via
+  `ParquetSerializer.create().nativeLogicalTypes(true)`; the default keeps the 
existing portable
+  string / `TIMESTAMP_MILLIS` normalization, so default output is 
byte-for-byte unchanged.
+- **Write knobs** — `pageSize` and `rowGroupSize` are now honored on write, 
splitting output into
+  multiple pages / row groups.
+
+See the [Parquet Basics](/docs/topics/ParquetBasics) topic page for details.
+
 ### Bug Fixes
 
 _TBD — to be filled in as development continues._
diff --git a/pages/topics/02.34.06.ParquetBasics.md 
b/pages/topics/02.34.06.ParquetBasics.md
index e87d38c43b..e52354f3d5 100644
--- a/pages/topics/02.34.06.ParquetBasics.md
+++ b/pages/topics/02.34.06.ParquetBasics.md
@@ -10,6 +10,40 @@ The `ParquetSerializer` and `ParquetParser` classes 
integrate with the standard
 `Serializer` / `Parser` APIs and support the `@Parquet` and `@ParquetConfig` 
annotations for
 format-specific configuration.
 
+##### External-read interop
+
+The parser reads spec-compliant Parquet produced by external writers 
(parquet-mr / Spark / Hive), not
+just files Juneau itself emits:
+
+- **Multi-page column chunks** — a column chunk split across several data 
pages is read end-to-end.
+- **Multi-row-group files** — every row group is read and concatenated, not 
just the first.
+- **Dictionary-encoded pages** — a `DICTIONARY_PAGE` followed by 
`PLAIN_DICTIONARY` / `RLE_DICTIONARY`
+  data pages (the parquet-mr default) is decoded back through its dictionary.
+- **Snappy compression** — Snappy-compressed pages are decompressed by a 
built-in, dependency-free
+  Snappy block decoder. Snappy is **decode-only**; on write use `UNCOMPRESSED` 
or `GZIP`. LZ4, Zstd,
+  Brotli, and LZO remain unsupported and are reported as a hard error rather 
than silent garbage.
+
+The `pageSize` and `rowGroupSize` builder settings control how Juneau splits 
its own output into pages
+and row groups (useful for streaming large datasets and for interop testing).
+
+##### Binary-native logical types
+
+The parser always decodes the binary-native logical types external tools emit:
+
+- **INT96** — legacy 12-byte timestamps (Impala / Hive / older Spark) decode 
to instants.
+- **DECIMAL** (INT32 / INT64 backed) decodes to `BigDecimal` with the schema's 
scale.
+- **DATE**, **TIME (micros)**, **TIMESTAMP (micros)** decode to the matching 
`java.time` types,
+  preserving sub-millisecond precision.
+
+On **write**, these native encodings are opt-in via 
`ParquetSerializer.create().nativeLogicalTypes(true)`.
+By default Juneau keeps its portable string / `TIMESTAMP_MILLIS` 
normalization, so default output is
+unchanged. Enable `nativeLogicalTypes()` for sub-millisecond-precise, 
parquet-mr-interoperable output.
+
+```java
+// Emit binary-native DECIMAL / DATE / TIME / TIMESTAMP-micros columns.
+ParquetSerializer s = 
ParquetSerializer.create().nativeLogicalTypes(true).build();
+```
+
 :::note
 Full documentation for the Parquet serializer/parser is coming soon. In the 
meantime, refer to the
 [Marshallers overview](/docs/topics/Marshallers) for general serializer/parser 
configuration patterns,
diff --git a/static/ai/juneau-knowledge.jsonl b/static/ai/juneau-knowledge.jsonl
index 0e22b8db67..feee001bc1 100644
--- a/static/ai/juneau-knowledge.jsonl
+++ b/static/ai/juneau-knowledge.jsonl
@@ -205,7 +205,7 @@
 {"description": "The <a 
href=\"/site/apidocs/org/apache/juneau/marshall/oapi/OpenApiParser.html\" 
target=\"_blank\">OpenApiParser</a> class is used to convert HTTP parts 
back\ninto POJOs.\n\nThe class hierarchy for the builder of this parser 
is:\n\n<tree>\n<node-0><java-abstract-class><a 
href=\"/site/apidocs/org/apache/juneau/Context.Builder.html\" 
target=\"_blank\">Context.Builder</a></java-abstract-class></node-0>\n<node-1><java-abstract-class><a
 href=\"/site/apidocs/org/apache/juneau/ [...]
 {"description": "Juneau supports converting arbitrary POJOs to and from TOML 
(Tom's Obvious Minimal Language) using native serializers and parsers 
implemented without any external dependencies.\nTOML is a configuration file 
format that maps unambiguously to hash tables, widely used in projects like 
Cargo (Rust) and Python's `pyproject.toml`.\nThe <a 
href=\"/site/apidocs/org/apache/juneau/marshall/toml/TomlSerializer.html\" 
target=\"_blank\">TomlSerializer</a> converts POJOs directly to T [...]
 {"description": "Juneau supports converting arbitrary POJOs to and from the 
**Protobuf Text Format** using native serializers and parsers implemented 
without any external dependencies. This is the human-readable text format (not 
the binary wire format) used for protobuf configuration files, debugging, and 
interop with tools like `protoc --decode`. The <a 
href=\"/site/apidocs/org/apache/juneau/marshall/prototext/PrototextSerializer.html\"
 target=\"_blank\">PrototextSerializer</a> converts [...]
-{"description": "The `org.apache.juneau.marshall.parquet` package provides 
Juneau serializer and parser implementations for the\n[Apache 
Parquet](https://parquet.apache.org/docs/file-format/) columnar storage 
format.\n\nThe `ParquetSerializer` and `ParquetParser` classes integrate with 
the standard Juneau\n`Serializer` / `Parser` APIs and support the `@Parquet` 
and `@ParquetConfig` annotations for\nformat-specific 
configuration.\n\n:::note\nFull documentation for the Parquet serializer/p [...]
+{"description": "The `org.apache.juneau.marshall.parquet` package provides 
Juneau serializer and parser implementations for the\n[Apache 
Parquet](https://parquet.apache.org/docs/file-format/) columnar storage 
format.\n\nThe `ParquetSerializer` and `ParquetParser` classes integrate with 
the standard Juneau\n`Serializer` / `Parser` APIs and support the `@Parquet` 
and `@ParquetConfig` annotations for\nformat-specific configuration.\n\n##### 
External-read interop\n\nThe parser reads spec-com [...]
 {"description": "Juneau supports converting arbitrary POJOs to and from the 
Protocol Buffers **binary** wire format using native, bean-driven serializers 
and parsers. No `.proto` schema file or code generation is required &mdash; the 
field-number/type schema is derived directly from Juneau bean metadata.\n\nThe 
<a 
href=\"/site/apidocs/org/apache/juneau/marshall/protobuf/ProtobufSerializer.html\"
 target=\"_blank\">ProtobufSerializer</a> converts POJOs directly to protobuf 
binary bytes, an [...]
 {"description": "Juneau supports converting arbitrary POJOs to and from YAML 
using native serializers and parsers implemented\nwithout any external 
dependencies.\nThe YAML serializer converts POJOs directly to YAML block-style 
output using indentation-based structure.\nThe YAML parser creates POJOs 
directly from YAML using an indentation-aware state machine.\n\nThe following 
example shows YAML for a typical bean:\n\n##### Sample Beans\n\n```java\npublic 
class Person {\n\n    // Bean prop [...]
 {"description": "The YAML data type produced depends on the Java object type 
being serialized.\n\n- Primitives and primitive objects are converted to YAML 
scalars.\n- Beans and `Maps` are converted to YAML block mappings.\n- 
`Collections` and arrays are converted to YAML block sequences.\n- Anything 
else is converted to YAML string scalars (with quoting if necessary).\n\n##### 
Data type conversions:\n\n| POJO type | YAML type | Example | Serialized form 
|\n|-----------|-----------|------ [...]
diff --git a/static/ai/manifest.json b/static/ai/manifest.json
index 15412d675b..dd7676ff67 100644
--- a/static/ai/manifest.json
+++ b/static/ai/manifest.json
@@ -3,8 +3,8 @@
   "record_count": 464,
   "schema_version": "1.0.0",
   "source_commit": {
-    "juneau": "2487121feb3ee201c6a27e9791481db0c13b64a1",
-    "juneau_docs": "624834ba134ac4e8b1146e377970dfdf88375c29"
+    "juneau": "7fc45280c7657982db8eb1a3f1ee1c45ab6dea13",
+    "juneau_docs": "c3847ad70e26ba516beb8b3593d34c38703b03de"
   },
   "version": "10.0.0"
 }

Reply via email to