Delta Lake UniForm Explained: One Table for Every Engine

Store data once and let Snowflake, Trino and Spark read the same table

Your team writes Delta tables in Databricks. Then a partner team says, "We use Snowflake and Trino. Can we read your data?"

A few years ago, the answer meant copying data. You exported files, built a second pipeline, and hoped both copies stayed in sync. They rarely did.

Today there is a calmer answer. It is called Delta Lake UniForm.

The problem with two table formats

Delta Lake and Apache Iceberg solve the same problem. Both add a transaction log on top of Parquet files. That log tells engines which files belong to the table right now.

The data files are almost the same. The difference is the metadata. Delta keeps a _delta_log folder. Iceberg keeps its own metadata and manifest files.

So an Iceberg engine looks at a Delta table and sees only a folder of Parquet files. It does not know which ones are current.

What UniForm does

UniForm stands for Universal Format. When you turn it on, Databricks writes Iceberg metadata next to the Delta log after each commit.

The Parquet files are written once. Only the small metadata is written twice. That means one copy of data, readable as Delta or as Iceberg.

flowchart LR
  W[Databricks writes] --> P[(Parquet data files)]
  W --> D[Delta log]
  W --> I[Iceberg metadata]
  D --> DB[Databricks and Spark]
  I --> EX[Snowflake, Trino, BigQuery]
  P --- DB
  P --- EX

The key idea is simple. You stop moving data between tools. You let tools come to the data.

Try it in Databricks Free Edition

You can create a UniForm table in Free Edition. Reading it from an outside engine needs extra setup, so here we focus on creating it and checking the result.

CREATE TABLE workspace.default.orders_uniform (
  order_id BIGINT,
  customer_id BIGINT,
  amount DECIMAL(10, 2),
  order_date DATE
)
TBLPROPERTIES (
  'delta.enableIcebergCompatV2' = 'true',
  'delta.universalFormat.enabledFormats' = 'iceberg'
);

INSERT INTO workspace.default.orders_uniform VALUES
  (1, 101, 49.99, DATE'2026-11-01'),
  (2, 102, 120.00, DATE'2026-11-02'),
  (3, 101, 15.50, DATE'2026-11-03');

Now check the table properties:

SHOW TBLPROPERTIES workspace.default.orders_uniform;

You should see the UniForm settings. Run DESCRIBE EXTENDED as well and look for Iceberg metadata details.

You can also turn UniForm on for a table that already exists:

ALTER TABLE workspace.default.my_existing_table SET TBLPROPERTIES (
  'delta.enableIcebergCompatV2' = 'true',
  'delta.universalFormat.enabledFormats' = 'iceberg'
);

Reading the table from Snowflake or Trino through the Unity Catalog Iceberg endpoint requires a paid Databricks workspace and external access setup. The concept is explained here for understanding.

Things to know before you turn it on

Deletion vectors. Iceberg compatibility needs deletion vectors turned off on the table. Databricks handles this for new tables, but check older tables first.

Metadata runs after the commit. Iceberg metadata is generated just after each Delta write. Outside readers may see the new data a few seconds later.

Writes stay in Delta. Outside engines read the table. Writes should still go through Databricks so one log stays the source of truth.

Some features do not carry over. Very new Delta features may not have an Iceberg version yet. Test your table before you promise it to another team.

Why this matters for your career

Most companies do not run one engine. They run three or four. The engineer who can say "one table, many readers" saves weeks of duplicate pipelines.

This is the same lesson behind every good platform. Keep one trusted copy. Govern it well. Let people use the tools they like.

Key takeaways

Continue learning