Skip to content

feat(scan): Support split and parallel scans - Part-2a: read Parquet files by task range - #1002

Open
kamcheungting-db wants to merge 6 commits into
apache:mainfrom
kamcheungting-db:feat/file-scan-task-range-reading
Open

kamcheungting-db wants to merge 6 commits into
apache:mainfrom
kamcheungting-db:feat/file-scan-task-range-reading

Conversation

@kamcheungting-db

@kamcheungting-db kamcheungting-db commented Oct 12, 2026 •

Copy link
Copy Markdown
Contributor

Summary

Let FileScanTaskReader read a byte range of a Parquet file. #976 added task ranges but rejected them at read time.

Depends on #976. Please review only the last two commits.

How it works

Each row group goes to the split that contains its starting byte (the first column's first page, as in parquet-mr). So splits that cover the file read every row exactly once.

Example: a file with 100-row groups starting at bytes 4, 1000, and 2000:

Task Row groups _pos
start=0, length=1000 0 0–99
start=1000, length=2000 1, 2 100–299

_pos and _row_id stay relative to the whole file, so deletes and row lineage still work.

Other changes:

  • works when the optional row-group file_offset is missing
  • recheck the range against the file size when opening
  • skip empty row groups; reject invalid page offsets
  • non-Parquet partial tasks still return NotSupported

Testing

Splits return the same rows, _pos, and _row_id as a whole-file read, with and without deletes. Also covers missing offsets, out-of-order row groups, and invalid offsets.

  • ctest --test-dir build-clang -R "^(data_test|parquet_test|scan_test)$" --output-on-failure
  • clang-format --dry-run --Werror, git diff --check

This pull request and its description were written by Isaac.

kamcheungting-db and others added 5 commits October 11, 2026 23:55
Preserve start and length in core and REST JSON, and reject partial reads until the reader can honor ranges.
Co-authored-by: Isaac <no-reply@databricks.com>
FileScanTaskReader previously rejected tasks that read part of a file.
It now passes Parquet task ranges to the reader while keeping the full
file size available for reading the footer.

Use the first column's starting page to assign each row group to a range.
This works when optional row-group offsets are missing and ensures that
adjacent ranges read every row exactly once. Keep row positions and
inherited row IDs relative to the whole file so deletes still remove the
correct rows, even when page offsets are out of order.

Recheck task bounds when opening a file, skip empty row groups, and reject
invalid page offsets and partial tasks for unsupported formats. Add tests
for split boundaries, deletes, row lineage, changed file sizes, and files
with missing row-group offsets.

Validation: all 306 tests in parquet_test and data_test pass. Formatting
and whitespace checks pass. pre-commit could not run because it is not
installed and PyPI DNS resolution failed during installation.
Co-authored-by: Isaac <no-reply@databricks.com>
@kamcheungting-db
kamcheungting-db force-pushed the feat/file-scan-task-range-reading branch from c06580b to cc5f910 Compare October 12, 2026 00:23
Co-authored-by: Isaac <no-reply@databricks.com>

This branch has not been deployed

No deployments
Sign up for free to 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.

1 participant