Iceberg Won the Format War. Now the Catalog Is the Battleground
Share

Iceberg Won the Format War. Now the Catalog Is the Battleground

For the past three years, the data engineering community has been arguing about table formats. Iceberg vs. Delta Lake vs. Hudi. Which open lakehouse format would win?

That debate is effectively over.

Apache Iceberg has become the default. Delta Lake now exposes tables via Iceberg-compatible APIs through UniForm. Apache Hudi supports Iceberg readers natively. Even Databricks, Delta Lake's creator, ships Iceberg-compatible exports. The format war produced a clear winner, and every major vendor has acknowledged it.

But here's what most articles are missing: the real lock-in risk has shifted to catalogs.

If your team is evaluating a lakehouse strategy right now, or you're mid-migration and feeling confident you've solved the hard problem, this post is worth reading before you declare victory.

What Is a Table Catalog, and Why Does It Matter?

A table format like Iceberg defines how data is stored and versioned on object storage. A catalog is the metadata layer that tells your query engines where that data lives and what it looks like.

Think of it this way: Iceberg is the filing system. The catalog is the index.

Without a catalog, every query engine connecting to your lakehouse has to independently discover table locations, schema definitions, partition layouts, and snapshot histories. That's not scalable. The catalog centralizes this metadata so that Spark, Trino, Snowflake External Tables, DuckDB, and any other engine can find and read the same tables consistently.

The practical implication: whichever catalog you standardize on, you're building deep operational dependencies into it. Your CI/CD pipelines, your dbt project, your access control policies, your cross-account sharing configurations. All of it runs through the catalog. Migrating catalogs later is painful in ways that migrating table formats is not.

The Three Catalogs That Matter Right Now

Snowflake Horizon Catalog / Apache Polaris

Polaris is Snowflake's open-source Iceberg catalog, built on the Apache Iceberg REST catalog spec. It was open-sourced in mid-2024 and is now managed by the Apache Software Foundation as Apache Polaris (Incubating).

The pitch: because Polaris implements the open REST spec, any engine that speaks Iceberg REST, Spark, Flink, Trino, Snowflake itself, can connect to it without vendor lock-in. In theory, you could run Polaris on your own infrastructure and maintain full portability.

In practice, the Snowflake-managed path has changed. Existing Snowflake Open Catalog customers can continue using Open Catalog and create additional accounts, but new customers are being directed to Snowflake Horizon Catalog for Apache Iceberg tables and multi-engine interoperability. Teams that want the open Polaris control plane without Snowflake's managed service can still evaluate Apache Polaris directly, but they need to own the operational overhead themselves.

Best for: Snowflake-primary teams that want to extend their lakehouse beyond Snowflake compute while staying aligned with Snowflake's governed catalog roadmap. Existing Open Catalog accounts can keep using that path; new Snowflake customers should evaluate Horizon Catalog first.

Databricks Unity Catalog

Unity Catalog is Databricks' unified governance layer for data, ML models, and notebooks. It's tightly integrated with the Databricks platform and has become the de facto standard for teams running serious Spark workloads.

Unity Catalog supports Iceberg reads (and writes, with some constraints) and exposes Iceberg REST endpoints for external engines. It is still most powerful when you're running Databricks compute, but the cross-engine governance story is stronger than it used to be: Databricks now supports cross-engine ABAC so external engines can read Unity Catalog tables with ABAC policies, row filters, and column masks enforced outside Databricks, subject to beta-stage requirements and limitations.

The lock-in concern is real and acknowledged even by Databricks customers we talk to. Migrating off Unity Catalog means migrating your access control policies, lineage graphs, feature store integrations, and audit logs, not just your table locations.

Best for: Teams committed to Databricks as their primary compute platform, who value deep ML/data integration and can accept the ecosystem dependency.

AWS Glue Data Catalog

Glue Data Catalog has been the default catalog for AWS-native lakehouse architectures for years. It integrates natively with Athena, EMR, Redshift Spectrum, and AWS Lake Formation for access control.

Glue added Iceberg table support, but it's a different model than Polaris or Unity Catalog. It's a Hive Metastore-compatible catalog that can register Iceberg tables, not a native Iceberg REST catalog. This matters for cross-engine interoperability: engines that expect the Iceberg REST spec may need additional configuration.

Glue is also fundamentally an AWS service; it doesn't run outside AWS, which matters if you're running a multi-cloud workload or want genuine compute portability.

Best for: Teams already deeply invested in the AWS ecosystem (Athena, EMR, S3) who aren't planning significant multi-cloud or cross-platform compute expansion.

The Interoperability Question

The data industry's promise with Iceberg was always "write once, query anywhere." The catalog layer is where that promise gets complicated.

True cross-engine interoperability requires a catalog that:

  1. Implements the Iceberg REST catalog spec faithfully
  2. Is accessible from outside a single vendor's compute plane
  3. Enforces access controls at the catalog level (not just compute level)

Polaris comes closest on paper. In practice, catalog interoperability is still early-stage. You'll find rough edges in external engine credential handling, snapshot expiration coordination, and schema evolution across engines. These are solvable, but require real engineering effort that doesn't show up in product demos.

For most mid-market teams, the honest recommendation is: pick the catalog that aligns with your primary compute platform, invest in Iceberg-native table management practices (schema versioning, partitioning strategy, snapshot retention policies), and defer the multi-catalog interoperability problem until you have a concrete use case that demands it.

What Should Mid-Market Teams Actually Do?

Here's the practical framework we're using with clients right now:

If you're Snowflake-primary

Evaluate Horizon Catalog for workloads that need governed open table access, like MotherDuck, DuckDB, or open-source Spark jobs that shouldn't pay Snowflake compute costs. Existing Snowflake Open Catalog customers can continue using that managed path, but new customers should not plan around creating a first Open Catalog account. If you specifically need the open Apache Polaris control plane, treat self-hosting as a platform-engineering commitment.

If you're Databricks-primary

Unity Catalog is your path. Lean into it fully for governance. The power is in the integration depth, not in multi-vendor flexibility. If cross-cloud compute portability becomes a future requirement, you'll have a well-governed Iceberg data layer to migrate from. That's a better position than undisciplined raw S3.

If you're AWS-native and compute-agnostic

Glue works fine for Athena-centric workloads. If you're running Spark on EMR and considering Flink or other engines, evaluate whether a standalone Iceberg REST catalog (Polaris self-hosted, or Nessie) gives you better engine flexibility than Glue's Hive-compatible model.

If you're greenfield

This is the rare case where we'd recommend starting with the catalog question before the compute question. Polaris's open REST spec gives you the most optionality. Pair it with a compute-agnostic query layer (DuckDB for interactive, Spark for batch scale) and you can defer the Snowflake vs. Databricks decision until your usage patterns are clearer.

The Brainforge Take

The Iceberg format war ending is good news for the industry. Standardizing on a common table format reduces the lowest-level lock-in and makes data more portable at rest.

But teams celebrating too early are missing the next layer of risk. Catalogs are where governance lives, where access control lives, and where the practical work of operating a multi-engine lakehouse gets done. Choosing a catalog is a multi-year commitment in a way that choosing a table format no longer is.

Our recommendation: make the catalog decision deliberately, with eyes open to the trade-offs. Don't let it default to "whichever catalog comes bundled with our primary compute platform" without evaluating whether that choice serves your data strategy long-term.

As a Snowflake partner, we're working closely with Polaris-based architectures for clients who want open lakehouse flexibility without giving up Snowflake's governance and query performance. If you're navigating this decision, we're happy to share what we're seeing in practice. Reach out to start a conversation.

Put this into practice

Bring one of these ideas to your own data

We scope a single use case and show you how it works, in weeks. Here is the shape of that work for a team like yours.

Book a scoping callData →See pricing →
Shipping

Clean Data for Smarter Shipping Ops

How Brainforge helped Stella Source unify quoting, CRM, and operations data into a governed analytics hub that cut quote turnaround time 60% and improved cost-estimation accuracy.

  • 60%reduction in quote turnaround time
  • 95%cost estimation accuracy achieved
  • <24 hrstime to actionable insights

Put the idea to work

Turn what you learned into a practical next step.

We can help you identify the right starting point, scope the work, and ship something useful without committing to a large transformation first.

AI Readiness Report
A clear breakdown of what Brainforge fixes, how fast, and what it actually delivers.
AI Readiness Report

Get the best insights right at your inbox.

A clear breakdown of what Brainforge fixes, how fast, and what it actually delivers.

No fluff. Just clarity.
Green spiral lines

Press Esc to close