The Value tax: when Arrow saves you (and when it doesn't)
A quick, honest tour of faucet-stream's columnar fast path — why converting Arrow to JSON and back is a tax worth avoiding, and why 'zero-cost' means something precise here.
Why a JSON record model, and what it costs
faucet-stream's record is a JSON value. That's the right default — schema-flexible, easy for any connector, and the substrate every governance rule operates on. But some connectors are columnar to the core: a Parquet file is Apache Arrow on disk; BigQuery streams Arrow; Delta and the object stores are columnar. When a columnar source feeds a columnar sink, decoding each Arrow batch into JSON rows and re-encoding it back to Arrow is pure tax — work that produces nothing.
How big is the tax?
We measured it. On a six-column analytical page, a single Arrow → Value → Arrow round-trip costs roughly 7–9× the entire Parquet decode+encode it wraps — and it's paid at every connector boundary. The conversion is larger than the useful work.
The fast path, and two senses of "zero-cost"
When both ends speak Arrow and nothing in between needs to see a row, faucet negotiates a columnar fast path: batches flow source → sink with no JSON round-trip. "Zero-cost" is precise here, and it means two things:
- Free when off. The Arrow support is inert by default — the compiled binary is byte-identical to the Value-only pipeline. You don't pay for what you don't use.
- Tax-free on the fast path. On a negotiated Arrow-to-Arrow chain, the conversion shim never runs.
The honest part: "zero-cost" is about the abstraction, not the I/O. The fast path removes the Value tax — it does not make Parquet encoding disappear. And the moment a value-shaped stage (masking, a quality check) needs a row, the pipeline correctly drops back to the row path. Speed never bypasses governance.
Read the details
This is the short version. The full mechanism — how the path is negotiated, which connectors are Arrow-native, and the exact numbers — is in the paper: A Zero-Cost Columnar Fast Path.
More on the blog, or read the documentation.