This is an automated email from the ASF dual-hosted git repository.
yihua pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/hudi-rs.git
The following commit(s) were added to refs/heads/main by this push:
new 2dab9e99 docs: fix stale API claims in README, reader spec, and agent
guides (#716)
2dab9e99 is described below
commit 2dab9e99f1baa004192239b15153926d3bc6b31e
Author: Y Ethan Guo <[email protected]>
AuthorDate: Thu Sep 3 19:20:49 2026 -0700
docs: fix stale API claims in README, reader spec, and agent guides (#716)
---
AGENTS.md | 7 +++++--
README.md | 8 ++++----
docs/reader-spec.md | 2 +-
python/AGENTS.md | 4 ++--
python/hudi/_internal.pyi | 5 +++--
5 files changed, 15 insertions(+), 11 deletions(-)
diff --git a/AGENTS.md b/AGENTS.md
index 9b26c5ce..9cd1d0a3 100644
--- a/AGENTS.md
+++ b/AGENTS.md
@@ -9,13 +9,16 @@ Arrow-native, `object_store` for all I/O, timeline-based MVCC.
```
crates/
- core/ hudi-core — config, expr, file_group, merge, metadata, schema,
storage, table, timeline, hfile
+ core/ hudi-core — avro_to_arrow, config, expr, file_group, hfile,
keygen, merge, metadata,
+ record, schema, statistics, storage, table, timeline, util
datafusion/ hudi-datafusion — DataFusion TableProvider (feature:
datafusion)
hudi/ public umbrella crate; re-exports core + (optional) datafusion
+ jvm-ffi/ hudi-jvm-ffi — plain C ABI for JVM callers via the Arrow C
Data Interface
test/ shared test fixtures
python/ PyO3 bindings (module hudi._internal); tests in python/tests
cpp/ cxx bindings; bridge in cpp/src/lib.rs
benchmark/tpch/ TPC-H benchmark harness
+benchmark/filegroup/ file-group read benchmark (fg-bench / fg-gen)
```
## Commands
@@ -126,7 +129,7 @@ single translation point exists to prevent.
Storage backends route by URI scheme (`file://`, `s3://`, `az://`, `gs://`)
through
[`object_store`](https://docs.rs/object_store) — don't hand-roll per-scheme
paths. Table options
-are typed: `HudiTableConfig`, `HudiReadConfig` (also Python enums). Prefer
enum members over raw
+are typed: `HudiTableConfig`, `HudiReadConfig`, `HudiPlanConfig` (also Python
enums). Prefer enum members over raw
string keys; bulk variants (`with_hudi_options` / `with_options`) currently
expect string keys.
## Code review
diff --git a/README.md b/README.md
index e5a3ca6c..4be8911f 100644
--- a/README.md
+++ b/README.md
@@ -109,7 +109,7 @@ async fn main() -> Result<()> {
let columns = vec!["rider", "city", "ts", "fare"];
for col_name in columns {
let idx = batch.schema().index_of(col_name).unwrap();
- println!("{}: {}", col_name, batch.column(idx));
+ println!("{col_name}: {:?}", batch.column(idx));
}
Ok(())
}
@@ -343,8 +343,8 @@ All read APIs accept a `ReadOptions` (Rust) /
`HudiReadOptions` (Python) value.
| Stage | API
| Description
|
|-----------------|------------------------------------------------------------------|----------------------------------------------------------------------------------------------------------|
| Query planning | `get_file_slices(options)`
| Get the file slices the read targets, dispatched on
`options.query_type`. To bucket for parallel reads, call
`hudi::util::collection::split_into_chunks` on the result. |
-| | `compute_table_stats(options)`
| Estimated `(num_rows, byte_size)` for scan planning. Snapshot (default)
uses the metadata table; incremental aggregates from changed file slices.
Returns `None` when stats cannot be computed. |
-| Query execution | `create_file_group_reader_with_options(read_options,
extra_storage_overrides)` | Create a file group reader with the table's
configs. Both args are optional. Timestamps are resolved automatically (e.g.
`AsOfTimestamp` → `EndTimestamp`), so callers can pass the same options used
for `get_file_slices`. |
+| | `compute_table_stats(options)`
| Estimated `(num_rows, byte_size)` for scan planning, derived from the
metadata table. Snapshot only. Returns `None` for incremental queries, and
whenever the estimate cannot be computed (no metadata table, non-Parquet base
files, footer sampling failure). |
+| Query execution | `create_file_group_reader_with_options(read_options,
extra_storage_overrides)` | Create a file group reader with the table's
configs. In Python both args are optional; in Rust `read_options` is an
`Option` and `extra_storage_overrides` takes a (possibly empty) iterator.
Timestamps are resolved automatically (e.g. `AsOfTimestamp` → `EndTimestamp`),
so callers can pass the same options used for `get_file_slices`. |
| | `read(options)` / `read_stream(options)`
| Record-read APIs. Dispatch on `options.query_type`. `read_stream`
errors on `Incremental` for now. Per-slice streaming lives on
`FileGroupReader`. |
### Read configs
@@ -451,7 +451,7 @@ ctx.sql("SELECT max(fare), city from trips group by city
order by 1 desc").show(
Hudi is also integrated with
-- [Daft](https://www.getdaft.io/projects/docs/en/stable/integrations/hudi/)
+- [Daft](https://docs.daft.ai/en/stable/connectors/hudi/)
-
[Ray](https://docs.ray.io/en/latest/data/api/doc/ray.data.read_hudi.html#ray.data.read_hudi)
### Work with cloud storage
diff --git a/docs/reader-spec.md b/docs/reader-spec.md
index 54405f12..1eae8581 100644
--- a/docs/reader-spec.md
+++ b/docs/reader-spec.md
@@ -195,7 +195,7 @@ Available pairs: `with_hudi_option` / `with_hudi_options`,
`with_storage_option`
| `FileSlice::base_file_relative_path()` / `log_file_relative_path(&LogFile)`
| Paths relative to the table base URI.
|
| `FileSlice::total_size_bytes()`
| Sum of base + log file on-disk sizes.
Missing metadata contributes 0. |
-`FileSlice` uses the base file's `num_records` as the record count for the
slice. Log file records are not counted separately because they merge into the
base file record batch during reads — the base file count represents the
materialized output. This applies to both snapshot and incremental stats.
`total_size_bytes()` includes log file on-disk sizes since they contribute to
I/O cost. File slices without a base file (log-only groups) are not yet
supported.
+`FileSlice` uses the base file's `num_records` as the record count for the
slice. Log file records are not counted separately because they merge into the
base file record batch during reads — the base file count represents the
materialized output. This applies to both snapshot and incremental stats.
`total_size_bytes()` includes log file on-disk sizes since they contribute to
I/O cost. A file slice without a base file (log-only group) is readable under
file group reader version 2 (the de [...]
## 5. Python API
diff --git a/python/AGENTS.md b/python/AGENTS.md
index a68cabff..e50298b6 100644
--- a/python/AGENTS.md
+++ b/python/AGENTS.md
@@ -53,11 +53,11 @@ Tests in `python/tests/`.
```python
import pytest
-from hudi import HudiTableBuilder
+from hudi import HudiReadOptions, HudiTableBuilder
def test_read_snapshot_with_filters():
table = HudiTableBuilder.from_base_uri("/tmp/test").build()
- batches = table.read_snapshot(filters=[("city", "=", "test")])
+ batches = table.read(HudiReadOptions(filters=[("city", "=", "test")]))
assert len(batches) > 0
def test_invalid_path_raises():
diff --git a/python/hudi/_internal.pyi b/python/hudi/_internal.pyi
index 2184a305..2ec130f8 100644
--- a/python/hudi/_internal.pyi
+++ b/python/hudi/_internal.pyi
@@ -146,8 +146,9 @@ class HudiFileGroupReader:
Reads a file slice as a stream of record batches.
For COW tables or read-optimized mode, this yields batches as they are
read
- without loading all data into memory. For MOR tables with log files,
this
- currently falls back to a single merged batch.
+ without loading all data into memory. For MOR slices with log files,
file
+ group reader version 2 (the default) yields merged chunks
incrementally;
+ version 1 falls back to a single merged batch.
"""
...