aihuaxu commented on code in PR #171:
URL: https://github.com/apache/parquet-site/pull/171#discussion_r2836406299


##########
content/en/blog/features/variant.md:
##########
@@ -0,0 +1,256 @@
+---
+title: "The Evolution of Semi-Structured Data: Introducing Variant in Apache 
Parquet"
+date: 2026-02-14
+description: "Native Variant Type in Apache Parquet"
+author: "[Aihua Xu](https://github.com/aihuaxu), [Andrew 
Lamb](https://github.com/alamb)"
+categories: ["features"]
+---
+
+## Introduction
+
+The Apache Parquet community is excited to announce the addition of the 
**Variant type**—a feature that brings native support for semi-structured data 
to Parquet, significantly improving efficiency compared to less efficient 
formats such as JSON. This marks a significant addition to Parquet, 
demonstrating how the format continues to evolve to meet modern data 
engineering needs.
+
+While Apache Parquet has long been the standard for structured data where each 
value has a fixed and known type, handling heterogeneous, nested data often 
required a compromise: either store it as a costly-to-parse JSON string or 
flatten it into a rigid schema. The introduction of the Variant logical type 
provides a native, high-performance solution for semi-structured data that is 
already seeing rapid uptake across the ecosystem.
+
+---
+
+## What is Variant?
+
+**Variant** is a self-describing data type designed to efficiently store and 
process semi-structured data—JSON-like documents with arbitrary and evolving 
schemas.
+
+---
+
+## Why Variant?
+
+Unlike traditional approaches that store JSON as text strings and require full 
parsing to access any field, making queries slow and resource-intensive, 
Variant solves this by storing data in a **structured binary format** that 
enables direct field access through offset-based navigation. Query engines can 
jump directly to nested fields without deserializing the entire document, 
dramatically improving performance.
+
+Unlike similar binary encodings such as BSON, Variant is optimized for the 
common case where multiple values share a similar structure: It avoids 
redundantly storing repeated field names and standardizes the best practice of 
**"shredded storage"** for pre-extracting structured subsets.
+
+### Key Benefits
+
+- **Type-Preserving Storage:** Original data types are maintained in their 
native formats—data types (integers, strings, booleans, timestamps, etc.) are 
preserved, unlike JSON which has a limited type system with no native support 
for types like timestamps or integers.
+
+- **Efficient Encoding:** The binary format uses field name deduplication to 
minimize storage overhead compared to JSON strings or BSON encoding.
+
+- **Fast Query Performance:** Direct offset-based field access provides 
performance improvement over JSON string parsing. Optional shredding of 
frequently accessed fields into typed columns further enhances query pruning 
and predicate pushdown.
+
+- **Schema Flexibility:** No predefined schema is required, allowing documents 
with different structures to coexist in the same column. This enables seamless 
schema evolution while maintaining full queryability across all schema 
variations, while still taking advantage of common structures when present.
+
+---
+
+## Overview of Variant Type in Parquet
+
+Parquet introduced the [Variant logical 
type](https://github.com/apache/parquet-format/blob/master/LogicalTypes.md#variant)
 in [August 2025](https://github.com/apache/parquet-format/pull/509).
+
+### Variant Encoding
+
+In Parquet, Variant is represented as a logical type and stored physically as 
a struct with two binary fields. The encoding is 
[designed](https://github.com/apache/parquet-format/blob/master/VariantEncoding.md)
 so engines can efficiently navigate nested structures and extract only the 
fields they need, rather than parsing the entire binary blob.
+
+```parquet
+optional group event_data (VARIANT(1)) {
+  required binary metadata;
+  required binary value;
+}
+```
+
+- **`metadata`:** Encodes type information and shared dictionaries (for 
example, field-name dictionaries for objects). This avoids repeatedly storing 
the same strings and enables efficient navigation.
+- **`value`:** Encodes the actual data in a compact binary form, supporting 
primitive values as well as arrays and objects.
+
+#### Example
+
+A web access event can be stored in a single Variant column while preserving 
the original data types:
+
+```json
+{
+  "userId": 12345,
+  "events": [
+    {"eType": "login", "timestamp": "2026-01-15T10:30:00Z"},
+    {"eType": "purchase", "timestamp": "2026-01-15T11:45:00Z", "amount": 99.99}
+  ]
+}
+```
+
+Compared with storing the same payload as a JSON string, Variant retains type 
information (for example, timestamp values are stored as integers rather than 
being stored as strings), which improves correctness, enables more efficient 
querying and requires fewer bytes to store.
+
+Just as importantly, Variant supports **schema variability**: records with 
different shapes can coexist in the same column without requiring schema 
migrations. For example, the following record can be stored alongside the event 
record above:
+
+```json
+{
+  "userId": 12345,
+  "error": "auth_failure" 
+}
+```
+
+---
+
+## Shredding Encoding
+
+To enhance query performance and storage efficiency, Variant data can be 
**shredded** by extracting frequently accessed fields into separate, 
strongly-typed columns, as described in the [detailed shredding 
specification](https://github.com/apache/parquet-format/blob/master/VariantShredding.md).
 For each shredded field:
+
+- If the field **matches the expected schema**, its value is written to the 
strongly typed field.
+- If the field **does not match**, the original representation is written as 
Variant-encoded binary field and the corresponding strongly typed field is left 
NULL.
+
+![Shredding Variant Visualization](/blog/variant/variant_shredding.png)

Review Comment:
   I trimmed the space below. Please take another look. 



-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: [email protected]

For queries about this service, please contact Infrastructure at:
[email protected]

Reply via email to