Build1 distinct publisher3 min readPublished
Native geometry and geography types in format v3, with matching Parquet 2.11 logical types underneath, give a shape column its own bounding boxes and a CRS that travels with the data. The second half is the part worth migrating for.
The Engineer · Build desk

Compiled by The EngineerSomething wrong?How this is made
A bounding box is a cheap necessary-condition test. The engine takes the envelope of the query shape, compares it against the box recorded for each file, and drops the file when the two do not overlap [3]. A miss is final; a hit only means the file might contain a match, so those shapes still get parsed. That asymmetry is the entire value, and it means the win depends on something no spec can hand you: files whose contents are spatially close together. Append by ingest time across a national delivery network and every file's box covers the whole country, at which point every box overlaps every query and nothing prunes.
The example the piece opens with is 40 million stops scanned to return 200,000 rows for one metro polygon [6]. That works out to 200 rows read per row returned [7]. It is also the one case the old workaround already handled: min/max statistics on two double columns give crude bounding-box pruning for point data, which is why teams stayed on that pattern for years [8]. If your spatial data is points and your predicates are envelopes, the scan-time gain here is small and the schema hygiene is the reason to move.
The real delta lands on everything that is not a point. A polygon, a route, or a service boundary does not fit in two numbers [8], so those tables went into a binary column as Well-Known Binary, the OGC byte encoding every spatial library reads and Iceberg saw as bytes [9]. The manifest then dutifully recorded byte-wise min and max for that column, bounds that are meaningless for location, so no engine skipped a file on them and every spatial predicate became a full scan followed by row-by-row parsing [10].
The coordinate reference system is the half I would actually migrate for. A CRS decides what a pair of numbers means: longitude 30, latitude 10 is one place under WGS84 and somewhere else under a projected national grid [11]. In a plain binary column that fact lived in a wiki page, a column comment, or someone's memory, and two teams writing the same table under different assumptions produced silent corruption no validation caught [12]. Format v3 puts the CRS in the schema, where it travels with the column [3]. It also splits the type in two, because flat-plane and spherical coordinates are different computations and mixing them returns wrong answers [17]. Geometry is the flat one: Euclidean distance, straight lines in coordinate space, correct for a projected CRS such as a state plane or UTM zone [18].
The provenance reads like engineering rather than announcement. The Wherobots team ran these ideas in production from 2022 as Sedona's Havasu fork, which bolted CRS metadata, bounding-box statistics and format annotations onto Iceberg and stopped being spatial the moment another engine opened the table [13][14]. Upstreaming cost more than 400 review comments on the Parquet logical type and 240 on the Iceberg type spec, at least 640 between them [15][16], which the author reads as a count of the decisions hiding inside "just add a geometry type" [20]. He discloses he works at Dremio, which ships v3, and keeps the argument at spec level [19].
In my context the case for adopting is the CRS and the cross-engine portability. The pruning is a bonus I would measure on my own file layout before promising it to an analyst.
Ranked by verification strength, evidence, and original report placement.
Apache Iceberg format version 3 adds two native primitive types, geometry and geography.
Apache Parquet 2.11 added matching logical types for spatial data at the file level.
Together the Iceberg and Parquet types give spatial data a declared type, a coordinate reference system that travels with the schema, and per-file bounding-box statistics that let an engine skip files before reading a single shape.
Before format version 3, coordinates lived in two double columns or in an opaque binary column, and neither the table format nor the file format knew the column was spatial.
Every optimization Iceberg applies to timestamps, integers and strings, from min/max pruning to partition transforms, did not apply to spatial data before v3.
In the article's example, a logistics table of 40 million delivery stops returns 200,000 rows for a metro-area polygon query, and the engine scans every data file because nothing in the table metadata says which files contain points inside that polygon.
Distinct publishers with included, body-backed reporting in this cluster.
dev.to
1 article · September 1, 2026
Follow any of these and your For You feed starts watching them — no settings page required.
build
Six specifications decide whether an agent can move off the harness it was built on1 distinct publisher
build
Iceberg votes to forbid new equality deletes in V4, and Parquet 1.18.0 lands with two corruption bugs1 distinct publisher
build
Iceberg won the table format war, then left the maintenance layer to you1 distinct publisher
build
Object or file storage: the wrong pick stays quiet until inode exhaustion1 distinct publisher
Evidence-backed comparisons of source perspectives and observed adoption signals. Read the methodology
Which Builder, Operator, and Investor concerns the observed source mix emphasized—not a truth score.
Evidence, demonstrated adoption, hype gap, incentives, and confidence are assessed independently, each on its own current evidence. How these are measured.
One vendor-authored explainer, checkable but unchecked
Everything load-carrying in this story — the two type signatures, the CRS and interpolation defaults, the per-file bounding boxes, the uselessness of byte-wise bounds on a WKB column — comes from a single dev.to post by a Dremio employee. That is a weak sourcing position with an unusual mitigation: these are spec assertions, so anyone can open the Iceberg v3 and Parquet 2.11 documents and settle them. Nobody in this reporting has. The 40-million-stop logistics table is a teaching device, not a customer, and the text breaks off before the production-failure material it advertises.
Landed in two specs, unquantified in the field
Three concrete footholds and not one number. The types exist in Iceberg v3 and in Parquet 2.11; Wherobots is described as having run the same design in production since 2022 before upstreaming it; Dremio ships support, per its own employee. Beyond that, silence: no other engine is named as reading the types, no team is shown migrating a WKB column, no query plan is shown pruning on the new bounding boxes.
Restrained on mechanism, forward on the payoff
By the standards of lakehouse writing this is a sober piece — it explains rather than sells, and it names the trap of mixing planar with geodesic math instead of glossing over it. The stretch is in the payoff. A 200-to-1 read amplification borrowed from a hypothetical does the persuasive work that a benchmark would normally do, and the promise that a CRS travelling with the schema is the part worth migrating for is asserted while the migration cost stays offstage.
Commercial interest on both sides of the byline
Two interests run through this. The author works at Dremio, which sells an engine with v3 support, and he says so plainly rather than burying it — disclosure earns some credit. Less visible is the shape of the origin story: crediting Wherobots for driving the spec is both plausible and a favourable narrative for a spatial-analytics vendor, and no engineer from a competing engine appears to test either the history or the difficulty. The bulk of the text is spec description, where the room to shade things is narrow.
Firm on what the spec says, thin on what it delivers
Split the story in two and the confidence splits with it. The descriptive half — types, defaults, statistics, why two types instead of one — is internally consistent, technically specific, and cheap to falsify against public documents, so it deserves the benefit of the doubt. The consequential half — how much scanning actually disappears, which engines honour the types, what breaks when you migrate — has one publisher, one vendor, and no measurements behind it.