Latest Results
feat(utf8): add split_part string function (#7371)
## Changes Made
Daft has a split function that returns a list of parts, but no direct
way to split a string on a delimiter and select the nth part. This PR
adds split_part, which does exactly that with the same name and behavior
as the function in PostgreSQL, DuckDB, Snowflake and Spark:
split_part(input, delim, part) returns the requested part, 1-based.
Negative parts count from the end, out of range parts return an empty
string, part 0 raises an error, and an empty delimiter means the string
is not split.
The implementation follows the same structure as substring_index and
translate from #7070:
- `src/daft-functions-utf8/src/split_part.rs`: Rust kernel with unit
tests
- `src/daft-functions-utf8/src/lib.rs`: registration, which also enables
the SQL function
- `daft/functions/str.py`: Python API function with doctests
- `daft/functions/__init__.py`: export
- `daft/expressions/expressions.py`: Expression method
- `tests/expressions/test_utf8.py`: tests covering the DataFrame, SQL,
RecordBatch and Series paths
Naming: #7350 has an open discussion on whether a different name or an
argument on split would be clearer. I kept split_part since it is the
common name across engines, and I am happy to rename or adjust.
Test evidence:
```
cargo test -p daft-functions-utf8 split_part
test result: ok. 11 passed; 0 failed; 0 ignored
DAFT_RUNNER=native pytest tests/expressions/test_utf8.py
21 passed
pytest --doctest-modules daft/functions/str.py::daft.functions.str.split_part
1 passed
```
All pre-commit hooks pass, including mypy, ruff, rustfmt and clippy.
AI usage: I used Claude while working on this, mostly to help me follow
the existing patterns and keep the code consistent with the other string
functions. I read and tested everything myself before opening this PR.
## Related Issues
Fixes #7350 feat: add read_blob function for reading files as raw bytes (#7318)
Adds `daft.read_blob()` which reads files matching a glob pattern into a
DataFrame with `path`, `size`, and `content` (binary) columns, similar
to [DuckDB's
`read_blob`](https://duckdb.org/docs/guides/file_formats/read_file.html).
Useful for loading non-tabular files (images, audio, PDFs, arbitrary
binaries) into a DataFrame for multimodal / ML pipelines.
## Changes Made
- Added `daft.read_blob(path, *, max_connections, on_error, io_config)`
in `daft/io/_blob.py`
- Returns one row per matched file with columns: `path` (String), `size`
(Int64), `content` (Binary)
- Supports wildcards (`*`, `?`, `[...]`, `**`) and remote object stores
(`s3://`, `gs://`, etc.), consistent with other readers
- Implemented in pure Python as a composition of the existing
`from_glob_path` scan and the `url_download` expression, so no Rust
changes are needed and it inherits their parallel IO behavior
- `max_connections` / `on_error` are passed through to `url_download`,
matching the semantics of `Expression.url.download()`
- Exported `read_blob` from `daft` and `daft.io`
- Added tests in `tests/io/test_read_blob.py` covering: empty path list
error, single file (schema + content), glob patterns, multiple explicit
paths, and empty files
- Added API docs entry (`docs/api/io.md`) and connectors index entry
(`docs/connectors/index.md`)
Tested locally with `DAFT_RUNNER=native pytest
tests/io/test_read_blob.py` (5 passed).
## Related Issues
Closes #2859
Note: the `read_text` half of #2859 is already implemented
(`daft.read_text`), so this PR completes the remaining `read_blob`
portion.
---------
Co-authored-by: hello-tang-rui <hello-tang-rui@users.noreply.github.com>
Co-authored-by: peter <132056702+hello-tang-rui@users.noreply.github.com> Latest Branches
0%
XuQianJin-Stars:feat/lerobot-v2 -1%
0%
hello-peter-tang:fix/downscale-reaper-hardening © 2026 CodSpeed Technology