Why DataFusion
DataFusion is a Rust query engine with a vectorized Arrow execution core, a full SQL frontend, and a physical planner that parallelizes across cores. Bloom adds three things to it:- An Iceberg bridge. A DataFusion
CatalogProviderover Iceberg REST that resolves only the tables a query actually names, rather than loading every table in every catalog. - Predicate pushdown into Iceberg scans. Supported primitive predicates are pushed down so Iceberg can prune by partition, manifest, file statistics, and reader. DataFusion still re-evaluates the original filters, so pruning never changes results.
- Distributed execution. The coordinator plans file tasks once and streams versioned tasks to workers. Workers never contact or preload the REST catalog.
Local mode
A local Bloom run executes entirely inside one sandbox and returns rows on the call. This is the default for interactive reads against theoleander catalog.
Sandbox size comes from the router’s input estimate - 2 vCPU for small queries up to 32 vCPU for inputs approaching 50 GiB. See machine sizing.
Distributed mode
Past 50 GiB of estimated input, Bloom goes distributed: a coordinator plus 2 to 10 workers, sized from the input.
A distributed run does not return rows. It always commits to a destination table, takes
OVERWRITE (default) or APPEND, and emits lineage from the workflow once it finishes, with the destination as the output dataset.
The final worker stage writes Parquet directly and returns only Iceberg DataFile metadata to the coordinator, which performs one Iceberg commit. Workers use refreshable, prefix-scoped credential leases for both reads and writes, and never receive the catalog token.
Bloom is metered compute and requires a payment method on file. An org without one falls back to DuckDB.
URL tables
Bloom can read a single CSV, JSON, or Parquet file directly from an absolute URL, quoted in place of a table name:http:// and https:// reads work in both modes. Range-capable servers are read by file-scan range; a server that ignores byte ranges or reports no length is downloaded once per runtime and cached in memory.
This is deliberately narrow. It rejects credentials, headers, query strings, fragments, directories, globs, relative paths, and cloud schemes such as s3://, gs://, and azure://. Use a catalog or an external connection for anything beyond one public file.
Writing to a table
When Bloom is asked to produce a table, the write is planned as a DataFusion DML plan whose target is the final table, and the plan is exposed before physical execution so lineage is extracted from the real plan rather than from a re-parse of the SQL.OVERWRITE completely replaces the destination - schema, partitioning, properties, history, and data. The replacement table is unpartitioned. APPEND adds to an existing compatible table, creating it unpartitioned from the result schema if it does not exist.
Versions
Iceberg 0.9.1 exposes no full-table overwrite transaction, so
OVERWRITE is implemented by writing a replacement table and swapping it in with catalog renames after the write succeeds. The logical plan still names only the final destination.