← Blog Blog · Performance

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.

faucet-stream·August 25, 2026·~5 min read

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.

Get started

Your first pipeline runs in five minutes.

Install the CLI, scaffold a config, and move real data — nothing external to stand up.

curl -LsSf https://github.com/faucet-hq/faucet-stream/releases/latest/download/faucet-cli-installer.sh | sh
brew install faucet-hq/faucet-stream/faucet-cli