This is an automated email from the ASF dual-hosted git repository.
yihua pushed a commit to branch asf-site
in repository https://gitbox.apache.org/repos/asf/hudi.git
The following commit(s) were added to refs/heads/asf-site by this push:
new dc7a2e5ad39d docs: improve the writing of the hudi-rs quick start and
release post (#20511)
dc7a2e5ad39d is described below
commit dc7a2e5ad39dd5ea589e7ed6b1d05a04ec6ce1da
Author: Y Ethan Guo <[email protected]>
AuthorDate: Tue Nov 3 13:55:25 2026 -0800
docs: improve the writing of the hudi-rs quick start and release post
(#20511)
---
...-11-03-apache-hudi-rs-0-6-0-release-announcement.mdx | 4 ++--
website/docs/python-rust-quick-start-guide.md | 17 +++++++++++------
.../version-1.2.0/python-rust-quick-start-guide.md | 17 +++++++++++------
.../version-1.2.1/python-rust-quick-start-guide.md | 17 +++++++++++------
4 files changed, 35 insertions(+), 20 deletions(-)
diff --git
a/website/blog/2026-11-03-apache-hudi-rs-0-6-0-release-announcement.mdx
b/website/blog/2026-11-03-apache-hudi-rs-0-6-0-release-announcement.mdx
index cbb2bee7ff6b..3ccde5f174c3 100644
--- a/website/blog/2026-11-03-apache-hudi-rs-0-6-0-release-announcement.mdx
+++ b/website/blog/2026-11-03-apache-hudi-rs-0-6-0-release-announcement.mdx
@@ -14,7 +14,7 @@ tags:
- record level index
---
-The Apache Hudi community is excited to announce the release of [hudi-rs
0.6.0](https://github.com/apache/hudi-rs/releases/tag/release-0.6.0), the
native Rust implementation of [Apache Hudi](/) with
[Python](https://pypi.org/project/hudi/0.6.0/) and
[C++](https://github.com/apache/hudi-rs/tree/release-0.6.0/cpp) bindings. Until
now, hudi-rs has been a reader: a fast, JVM-free way to query Hudi tables from
Rust, Python,
[DataFusion](https://github.com/apache/hudi-rs/blob/release-0.6.0/REA [...]
+The Apache Hudi community is excited to announce the release of [hudi-rs
0.6.0](https://github.com/apache/hudi-rs/releases/tag/release-0.6.0), the
native Rust implementation of [Apache Hudi](/) with
[Python](https://pypi.org/project/hudi/0.6.0/) and
[C++](https://github.com/apache/hudi-rs/tree/release-0.6.0/cpp) bindings. Hudi
is the open lakehouse platform that brings indexing, upserts and incremental
processing to data lakes, and hudi-rs brings it to programs that run without a
JVM. Un [...]
Many of today's pipelines that update tables run in a plain Python process or
in a non-JVM engine. A retrieval pipeline embeds documents and has to keep its
knowledge base current as sources are added, edited and removed. A model team
curates a fine-tuning set between training runs, correcting and rejecting
examples, and has to reproduce the exact version each model was trained on. A
service or an agent corrects records in a dataset as it finds errors. Each of
them changes a small slice [...]
@@ -102,7 +102,7 @@ The same workloads, run through
[delta-rs](https://github.com/delta-io/delta-rs)
<img
src="/assets/images/blog/2026-11-03-apache-hudi-rs-0-6-0-release-announcement/3-write-latency.png"
alt="Seconds per upsert and delete commit on five workloads: hudi-rs 0.6.0
Merge-on-Read with the record-level index against delta-rs and PyIceberg, with
hudi-rs 1.2 to 12 times faster on upserts and 4.8 to 24 times faster on
deletes, except tpcds-web-returns, where hudi-rs and delta-rs are comparable"
width="1000"/>
</div>
-The upserts are fast because of the low write amplification and record-level
index. A commit on a Merge-on-Read table appends only the changed records to
log files, and the record-level index points each key at its file group, so an
upsert commit in hudi-rs writes 4 to 200 times fewer bytes than the same commit
in the other two libraries. Neither delta-rs nor PyIceberg writes deletion
vectors in their latest releases ([delta-rs
1.6.6](https://github.com/delta-io/delta-rs/releases/tag/pyt [...]
+The upserts are fast because of the low write amplification and record-level
index. A commit on a Merge-on-Read table appends only the changed records to
log files, and the record-level index points each key at its file group, so an
upsert commit in hudi-rs writes 4 to 200 times fewer bytes than the same commit
in the other two libraries. Neither delta-rs nor PyIceberg writes deletion
vectors in their latest releases ([delta-rs
1.6.6](https://github.com/delta-io/delta-rs/releases/tag/pyt [...]
<div style={{ textAlign: 'center' }}>
<img
src="/assets/images/blog/2026-11-03-apache-hudi-rs-0-6-0-release-announcement/4-write-bytes.png"
alt="MiB written per upsert and delete commit: hudi-rs writes 4 to 200 times
fewer bytes per upsert commit than delta-rs and PyIceberg" width="1000"/>
diff --git a/website/docs/python-rust-quick-start-guide.md
b/website/docs/python-rust-quick-start-guide.md
index 140efe2fa8e5..90bd1d1911ad 100644
--- a/website/docs/python-rust-quick-start-guide.md
+++ b/website/docs/python-rust-quick-start-guide.md
@@ -7,10 +7,12 @@ import Tabs from '@theme/Tabs';
import TabItem from '@theme/TabItem';
[hudi-rs](https://github.com/apache/hudi-rs) is the native Rust implementation
of Apache Hudi with Python bindings.
-It creates Hudi tables and runs upserts, updates, and deletes on them from a
single process, with no JVM and no
-Spark. Every write maintains the table's metadata table and record-level
index, so updating or deleting a handful
-of rows in a large table costs a few index lookups and the rewrite of the file
groups that hold those rows, not a
-scan of the table.
+With `pip install hudi`, a single Python process creates Hudi tables and
upserts, updates and deletes rows in them,
+with no JVM and no Spark, and the same tables are read by Spark, Trino,
DuckDB, Polars, DataFusion and every other
+engine supporting Hudi. Upserts, updates and deletes stay under a second on a
single node as tables grow into the
+millions of rows. Every write maintains the table's metadata table and
record-level index, so updating or deleting
+a handful of rows in a large table costs a few index lookups and the rewrite
of the file groups that hold those
+rows, not a scan of the table.
This page gets you from `pip install` to a table you can upsert into, delete
from, and read incrementally, then
shows how to query it from Python, Rust, DuckDB, Polars, and DataFusion.
@@ -250,8 +252,11 @@ across the table, so each Copy-on-Write commit rewrites
nearly all of it: per up
<img src="/assets/images/docs/python-rust-quick-start/write-bytes.png"
alt="MiB written per upsert and delete commit on the same five workloads"
width="1000"/>
</div>
-Loading the 10M-row table in Hudi takes 5.7 s, about 2.4 s of which builds the
metadata table and its record-level
-index, an investment that pays off in the latency of every later upsert and
delete.
+The trade-off shows up in the bulk load. Loading the 10M-row `uuid` table
takes 5.7 s in Hudi against 2.8 s for
+delta-rs and 1.3 s for PyIceberg, because about 2.4 s of it builds the
metadata table and its record-level index up
+front, an investment that pays off in the latency of every later upsert and
delete. The initial load is likewise
+slower on `nyc-taxi` and `tpcds-web-returns`, and on par or faster on the two
1M-row workloads, `rag-chunks` and
+`training-set`.
{/* BENCHMARK_TABLE_END */}
**Reproduce it.** [This
guide](https://gist.github.com/yihua/66ad80224f8e50020025dc76d138dd0a) pins the
hudi-rs
diff --git
a/website/versioned_docs/version-1.2.0/python-rust-quick-start-guide.md
b/website/versioned_docs/version-1.2.0/python-rust-quick-start-guide.md
index 140efe2fa8e5..90bd1d1911ad 100644
--- a/website/versioned_docs/version-1.2.0/python-rust-quick-start-guide.md
+++ b/website/versioned_docs/version-1.2.0/python-rust-quick-start-guide.md
@@ -7,10 +7,12 @@ import Tabs from '@theme/Tabs';
import TabItem from '@theme/TabItem';
[hudi-rs](https://github.com/apache/hudi-rs) is the native Rust implementation
of Apache Hudi with Python bindings.
-It creates Hudi tables and runs upserts, updates, and deletes on them from a
single process, with no JVM and no
-Spark. Every write maintains the table's metadata table and record-level
index, so updating or deleting a handful
-of rows in a large table costs a few index lookups and the rewrite of the file
groups that hold those rows, not a
-scan of the table.
+With `pip install hudi`, a single Python process creates Hudi tables and
upserts, updates and deletes rows in them,
+with no JVM and no Spark, and the same tables are read by Spark, Trino,
DuckDB, Polars, DataFusion and every other
+engine supporting Hudi. Upserts, updates and deletes stay under a second on a
single node as tables grow into the
+millions of rows. Every write maintains the table's metadata table and
record-level index, so updating or deleting
+a handful of rows in a large table costs a few index lookups and the rewrite
of the file groups that hold those
+rows, not a scan of the table.
This page gets you from `pip install` to a table you can upsert into, delete
from, and read incrementally, then
shows how to query it from Python, Rust, DuckDB, Polars, and DataFusion.
@@ -250,8 +252,11 @@ across the table, so each Copy-on-Write commit rewrites
nearly all of it: per up
<img src="/assets/images/docs/python-rust-quick-start/write-bytes.png"
alt="MiB written per upsert and delete commit on the same five workloads"
width="1000"/>
</div>
-Loading the 10M-row table in Hudi takes 5.7 s, about 2.4 s of which builds the
metadata table and its record-level
-index, an investment that pays off in the latency of every later upsert and
delete.
+The trade-off shows up in the bulk load. Loading the 10M-row `uuid` table
takes 5.7 s in Hudi against 2.8 s for
+delta-rs and 1.3 s for PyIceberg, because about 2.4 s of it builds the
metadata table and its record-level index up
+front, an investment that pays off in the latency of every later upsert and
delete. The initial load is likewise
+slower on `nyc-taxi` and `tpcds-web-returns`, and on par or faster on the two
1M-row workloads, `rag-chunks` and
+`training-set`.
{/* BENCHMARK_TABLE_END */}
**Reproduce it.** [This
guide](https://gist.github.com/yihua/66ad80224f8e50020025dc76d138dd0a) pins the
hudi-rs
diff --git
a/website/versioned_docs/version-1.2.1/python-rust-quick-start-guide.md
b/website/versioned_docs/version-1.2.1/python-rust-quick-start-guide.md
index 140efe2fa8e5..90bd1d1911ad 100644
--- a/website/versioned_docs/version-1.2.1/python-rust-quick-start-guide.md
+++ b/website/versioned_docs/version-1.2.1/python-rust-quick-start-guide.md
@@ -7,10 +7,12 @@ import Tabs from '@theme/Tabs';
import TabItem from '@theme/TabItem';
[hudi-rs](https://github.com/apache/hudi-rs) is the native Rust implementation
of Apache Hudi with Python bindings.
-It creates Hudi tables and runs upserts, updates, and deletes on them from a
single process, with no JVM and no
-Spark. Every write maintains the table's metadata table and record-level
index, so updating or deleting a handful
-of rows in a large table costs a few index lookups and the rewrite of the file
groups that hold those rows, not a
-scan of the table.
+With `pip install hudi`, a single Python process creates Hudi tables and
upserts, updates and deletes rows in them,
+with no JVM and no Spark, and the same tables are read by Spark, Trino,
DuckDB, Polars, DataFusion and every other
+engine supporting Hudi. Upserts, updates and deletes stay under a second on a
single node as tables grow into the
+millions of rows. Every write maintains the table's metadata table and
record-level index, so updating or deleting
+a handful of rows in a large table costs a few index lookups and the rewrite
of the file groups that hold those
+rows, not a scan of the table.
This page gets you from `pip install` to a table you can upsert into, delete
from, and read incrementally, then
shows how to query it from Python, Rust, DuckDB, Polars, and DataFusion.
@@ -250,8 +252,11 @@ across the table, so each Copy-on-Write commit rewrites
nearly all of it: per up
<img src="/assets/images/docs/python-rust-quick-start/write-bytes.png"
alt="MiB written per upsert and delete commit on the same five workloads"
width="1000"/>
</div>
-Loading the 10M-row table in Hudi takes 5.7 s, about 2.4 s of which builds the
metadata table and its record-level
-index, an investment that pays off in the latency of every later upsert and
delete.
+The trade-off shows up in the bulk load. Loading the 10M-row `uuid` table
takes 5.7 s in Hudi against 2.8 s for
+delta-rs and 1.3 s for PyIceberg, because about 2.4 s of it builds the
metadata table and its record-level index up
+front, an investment that pays off in the latency of every later upsert and
delete. The initial load is likewise
+slower on `nyc-taxi` and `tpcds-web-returns`, and on par or faster on the two
1M-row workloads, `rag-chunks` and
+`training-set`.
{/* BENCHMARK_TABLE_END */}
**Reproduce it.** [This
guide](https://gist.github.com/yihua/66ad80224f8e50020025dc76d138dd0a) pins the
hudi-rs