Which open table format fits your lakehouse workload
If you run several engines against the same tables, such as Spark, Trino and Flink, Apache Iceberg is the format built around that case, because its specification is designed for many engines to share one table at the same time. If you run one engine with heavy upserts, deletes and change data capture, Apache Hudi deserves the closest look, since its record-level indexes and Merge On Read tables target that write pattern directly. If your platform is already built on Databricks or you want the transaction log model that Databricks originated, Delta Lake is the natural fit, and it is an independent, Linux Foundation sub-project with a published charter.
All three are open source. Iceberg and Hudi are Apache-2.0 licensed, and Delta Lake's repository is also Apache-2.0 and, per Delta.io, is governed as a Linux Foundation sub-project. None of the three is a paid product you must buy to use the format itself. The choice turns on three questions: which engines must read and write the tables, whether your writes are append-heavy or update-heavy, and which skills your team already has. Check each engine's support for the exact format version you plan to run, since reads and writes in Trino, Flink or Spark can differ by connector and release.
Before committing, run a short proof of concept with your real write volume and your slowest engine. Measure update latency, read freshness and compaction behavior under load, and confirm that your catalog (for example, a Hive metastore, AWS Glue or a REST catalog) supports the format you pick. Ask your platform team who will operate compaction, cleaning and snapshot expiry, because those services recur and their effort is easy to underestimate. Interoperability is not all or nothing: Delta UniForm lets Iceberg and Hudi clients read Delta tables, which can reduce lock-in but adds its own operational checks.
Which format to choose by workload
This table maps common lakehouse workloads to the table format that fits each best, with the supplied facts behind each choice and the condition that would point elsewhere. Read it by matching your dominant workload to a row, then checking the condition column against your engines, catalog and write pattern. The main takeaway is that engine mix and write pattern decide the format more than feature lists do.
| Workload | Best fit and reason | Choose another format when |
|---|---|---|
| Multi-engine read and write across Trino, Spark and Flink | Apache Iceberg. It is designed so engines such as Spark, Trino, Flink, Presto, Hive and Impala work on the same tables at the same time, and its Trino connector supports several catalog types. | Your Spark and Flink jobs run mainly on Databricks, where Delta Lake is the default format. Confirm current Flink write support for your chosen format and version before committing. |
| Spark-first lakehouse on Databricks or Fabric | Delta Lake. Databricks makes Delta Lake the default format for all tables, and Microsoft's OneLake stores Delta Parquet or Iceberg tables. | You need Trino or Flink as primary writers and do not want the platform's default format. Delta's Trino connector and Flink connector (preview) are narrower than Iceberg's engine coverage. |
| High-volume upserts and CDC from Kafka | Apache Hudi. Its record-level indexes support fast upserts and deletes, it provides a Kafka Connect sink, and it offers change-data-capture queries with before and after images. | Updates are occasional and mostly append-driven, or your team wants one format across many engines more than fast record-level writes. Iceberg v2 delete files and v3 deletion vectors are the comparison to test. |
| Merge On Read versus Copy On Write for frequent updates | Hudi Merge On Read. Updates land in log files and compaction runs periodically, which keeps writes cheap, though read-optimized queries only see data up to the last compaction. | Read latency matters more than write latency and most tables are rewritten rarely. Hudi Copy On Write gives high read performance with slower writes, so it fits read-heavy tables. |
| Read-heavy analytics with infrequent updates | Apache Iceberg. Schema evolution without rewriting tables, hidden partitioning and time travel to exact snapshots suit tables that are queried far more often than they change. | Your Databricks footprint is large and you rely on Delta-specific features. Delta Lake also offers time travel, schema enforcement and merge operations, so the choice then follows platform fit. |
| Mixed estate with several query engines reading one copy of data | Delta Lake with UniForm, or Iceberg as the shared format. UniForm lets Iceberg and Hudi clients read Delta tables, which reduces copies when readers differ. | You need one format to be the single write path with no metadata translation. Confirm UniForm behavior for each reader and version you run before relying on it. |
| Self-hosted, vendor-neutral governance requirement | Apache Iceberg or Apache Hudi, both under the Apache License 2.0 at the Apache Software Foundation. Delta Lake is also Apache-2.0 licensed and a Linux Foundation sub-project with a published charter. | Your review asks for a single project governance body. Ask each project's maintainers and charter documents how decisions are made before you decide. |
How each format tracks snapshots, deletes and updates
Iceberg, Delta Lake and Hudi all make writes atomic, but they record table state differently, and that difference decides what an update or delete costs and how fast reads stay. Iceberg tracks each table as a chain of snapshots, where each snapshot points to manifest lists and manifests that describe the data files. Time travel to exact historical snapshots and rollback to an earlier table state are core Iceberg features, so a bad write can be reverted by pointing the table back at an earlier snapshot. Iceberg's delete handling depends on the format version: row-level deletes are recorded as separate delete files that readers apply at query time, so reads get slower as delete files accumulate until they are compacted. Confirm the format version your engines write and the delete file behavior of each engine version you run.
Delta Lake records every change in a file-based transaction log kept alongside the Parquet data files. The log gives ACID transactions with serializable isolation, time travel to earlier table versions, and merge, update and delete operations as committed log entries. Because Databricks originally developed the protocol and makes Delta the default format on its platform, the log design is most familiar to teams already on that stack. For self-hosted Spark or Trino users, the practical questions are which engine version supports the operations you need, how often you run the vacuum and optimize routines that remove old files, and how the table reads through UniForm if other engines must see it as Iceberg or Hudi.
Hudi organizes writes around a commit timeline and lets you pick a table type that sets the trade-off between write and read cost. In Copy On Write tables, updates and deletes create new base files and no log files are written, which gives high read performance but slower writes. In Merge On Read tables, updates and deletes go to log files that are merged with base files at query time, and a periodic compaction folds them into new base files. Read-optimized queries see data only up to the last compaction, so a dashboard reading that view can lag recent upserts until compaction runs. Ask your team which query types must show the newest rows and schedule compaction to match that requirement.
Capabilities of Iceberg, Delta Lake and Hudi side by side
This table compares governance, licensing, release status, schema and time travel, update and delete handling, streaming ingestion, catalogs, engine support and cross-format reads for the three open table formats. Where a capability is not covered by the supplied project facts, the cell says what to confirm in the project documentation. Use it to narrow the shortlist, then test the rows that decide your workload against your own engines.
| Capability | Apache Iceberg | Delta Lake | Apache Hudi |
|---|---|---|---|
| Governance and license | Apache License 2.0, developed under the Apache Software Foundation | Apache License 2.0, Linux Foundation sub-project since 2019 with a published charter | Apache License 2.0, Apache Software Foundation project |
| Latest supplied release | 1.12.0 listed as latest on the documentation menu | 4.4.1, published October 5, 2026 | 1.2.1, published September 24, 2026 |
| Schema evolution and time travel | Schema evolution without table rewrites, time travel to exact snapshots and rollback listed as core features | Schema enforcement and time travel to earlier table versions; confirm evolution options in the Delta docs | Snapshot, incremental and time-travel queries on one table; confirm schema change rules in the Hudi docs |
| Update and delete handling | Row-level changes handled through delete files; confirm which delete file types each engine writes and reads | Merge, update and delete operations supported on tables with an audit history | Copy On Write rewrites base files for updates and deletes; Merge On Read writes log files merged at query time, with compaction |
| Streaming ingestion | Engine-dependent; confirm streaming write support in your chosen engine's connector docs | Unified batch and streaming; a preview Flink connector writes to Delta Lake per the README | Built-in ingestion for Spark and Flink, a Kafka Connect sink, and non-blocking concurrency control for late data |
| Catalog options | Trino supports Hive metastore, AWS Glue, JDBC, REST, Nessie and Snowflake catalogs via iceberg.catalog.type | Engines such as Spark, Trino and Snowflake read Delta tables; confirm catalog choices against your engine | Confirm catalog integrations in the Hudi docs for your metastore |
| Engine support (Spark, Trino, Flink, Presto) | Spark, Trino, Flink, Presto, Hive and Impala named as engines that share tables | Spark, PrestoDB, Flink and Trino listed; Trino connector reads and writes, Flink connector in preview | Spark and Flink have built-in ingestion tools; confirm Trino and Presto read paths in the Hudi docs |
| Interoperability (UniForm) | Reads from other formats depend on the catalog and engine; confirm cross-format options in the Iceberg docs | UniForm lets Iceberg and Hudi clients read Delta tables | Confirm whether Iceberg or Delta clients can read Hudi tables in your version |
License and governance of each format
Apache Iceberg is licensed under the Apache License 2.0 and is developed within the Apache Software Foundation. Its main repository holds the Java reference implementation, and separate implementations exist for Python (PyIceberg), Go, Rust and C++. Because the reference work is community-governed under the ASF, no single vendor controls the table specification, and engines such as Spark, Trino, Flink, Presto, Hive and Impala can all read the same tables.
- License: Apache License 2.0 for the specification work and the main repository.
- Reference code: The Java implementation is the reference, which matters when you need a feature in an engine that lags behind.
- Client libraries: PyIceberg, Go, Rust and C++ implementations let non-JVM services read and write tables, but confirm feature parity for the operations you need.
- Governance: Development follows the ASF model of open, community-led decisions rather than a single company roadmap.
- Commercial offerings: Managed catalogs and services built on Iceberg are vendor-specific, and no paid edition of the format itself is supplied.
Confirm with your platform team which Iceberg client implementations and catalog types your engines support in their versions, since the reference license does not guarantee identical behavior across implementations.
Delta Lake is released under the Apache License 2.0 and is described on delta.io as an open-source storage framework for building a lakehouse architecture. Delta.io states that Delta Lake has been a Linux Foundation sub-project since 2019, that it is an independent open-source project not controlled by any single company, and that it follows a published charter. Databricks documentation states that Databricks originally developed the protocol, continues to contribute to it, and makes Delta Lake the default format for all tables on Databricks.
- License: Apache License 2.0 for the delta-io/delta repository.
- Governance: A Linux Foundation sub-project since 2019, operating under a published charter.
- Origin: Databricks developed the protocol and remains a major contributor, so its roadmap influence is significant.
- Default format: Databricks uses Delta Lake for all tables by default, so Databricks-centric teams get it without a separate decision.
- Commercial offerings: Databricks and other managed platforms are vendor-specific, and no paid edition of Delta Lake is supplied.
Ask for the current charter and contributor breakdown from the project if the origin of the protocol matters for your procurement review, and check how your target engines implement Delta features.
Apache Hudi is an Apache Software Foundation project licensed under Apache-2.0. It describes itself as an open data lakehouse platform built on an open table format that covers ingestion, indexing, storage, serving, transformation and management of data. Because it sits under the ASF, its governance follows the same community model as Iceberg, and its project scope is broader than a table format alone because it includes ingestion tooling and table services.
- License: Apache-2.0, with the project hosted within the Apache Software Foundation.
- Scope: The project bundles ingestion tools for Spark and Flink and a Kafka Connect sink, so the governance question covers more than the table specification.
- Release cadence: Release 1.2.1 was published on September 24, 2026, per the apache/hudi releases page, so check the current release notes before you pin a version.
- Table services: Cleaning, clustering and compaction are part of the project, and their operating model is a governance-adjacent concern for platform owners.
- Commercial offerings: Any managed Hudi service is vendor-specific, and no paid edition of the project is supplied.
Before committing, confirm the Hudi version and the ingestion components your team will run, and review the project's contributor activity and governance documents directly.
What drives the running cost of each format
Licenses for all three formats are open source, so the running cost sits mostly in the platform around the table. The cards below separate one-time work such as migration and schema design from recurring spend on compute, storage, catalog operations and the people who keep the tables healthy.
Catalog service choice
Iceberg tables are tracked by a catalog, and Trino's Iceberg connector supports Hive metastore, AWS Glue, JDBC, REST, Nessie and Snowflake catalogs, selected with iceberg.catalog.type. Each option carries its own hosting, backup and access-control work, and some are managed services with usage charges. Ask which catalog each engine will use, who operates it, and whether that catalog is billed per request or hosted by you.
Compaction and table maintenance
Every format accumulates small files and old snapshots that must be compacted, cleaned and expired on a schedule. Hudi exposes cleaning, clustering and compaction as table services that run inline with writers or as separate jobs, so their compute cost lands on the writer or on a dedicated cluster. Budget recurring compute for these jobs and confirm which team owns their schedules and failures.
Streaming write pattern
Frequent upserts and deletes change the cost profile more than any other design choice. In Hudi Merge On Read tables, writes go to log files that a periodic compaction later folds into base files, while Copy On Write tables make writes slower and reads faster. Estimate write frequency, late-arriving data and the compaction cadence before you choose a table type, because each one changes the compute you pay for every hour.
Engine licensing and compute
All three formats are open source, so the format itself carries no license fee. The engines that read and write them, such as Spark, Trino and Flink, are open source too, but managed platforms that run them, including Databricks and Snowflake, bill for compute and for the features they add. Ask each vendor which engine capabilities require a paid tier and which are included in the open-source build.
Storage layout and retention
Retained snapshots, delete files, log files and small Parquet files all occupy object storage and are billed as storage. Layout choices such as partitioning and file sizing decide how much data each query scans, which drives compute cost on every read. Set a snapshot retention policy at design time and measure scan volume after the first production month.
Staff skills and migration
Migration work and schema design are one-time costs, while on-call operation, upgrades and incident response recur. Delta Lake's transaction log is familiar to Databricks teams, while Iceberg and Hudi operations depend on catalog and table service expertise that many teams build from scratch. Ask any implementation partner for a written scope that names the migration tasks, the training handover and the upgrade responsibilities.
What implementing each format involves
Setup differs most in where the catalog lives. An Iceberg deployment starts by choosing a catalog and setting it per engine, for example iceberg.catalog.type in the Trino Iceberg connector, which supports Hive metastore, AWS Glue, JDBC, REST, Nessie and Snowflake catalogs. The catalog choice then determines which Spark or Flink catalog configuration you maintain across every engine, so decide it before the first table is created. Delta Lake is simpler on paper: Spark is the primary write path, the Trino connector reads and writes Delta tables, and the Flink connector that writes to Delta Lake is listed as a preview. Treat any production Flink write path as something to validate with your own workload. Hudi ships built-in ingestion tools for Spark and Flink, plus a Kafka Connect sink, so a streaming pipeline can be assembled from those parts. Table services such as cleaning, clustering and compaction can run inline with the writer or as separate jobs, and that choice decides how much scheduling you must build yourself.
Migrating an existing Parquet or Hive estate is the largest effort item for all three formats, and it is rarely a single step. Converting or registering existing files is the cheap part, while validating partitioning, schema mapping, statistics and downstream queries against every consuming engine takes most of the time. Ask each option's maintainers and your engine vendors which migration paths they support for your current table layout, and whether a converted table can still be read by the other engines you run. Be specific about the Hive metastore: if Trino, Spark and your BI tools all depend on it today, confirm how each engine's catalog configuration changes after the move. Test time travel, rollback and delete behavior on a copy of a representative table before cutting over, because those are the features teams most often assume carry over unchanged.
Plan the operating work along with the initial build. Iceberg, Delta Lake and Hudi each need periodic maintenance, including snapshot or log expiration, file compaction and orphan file cleanup, and the schedule for that work becomes a recurring operational task. For Hudi Merge On Read tables, compaction determines how fresh read-optimized queries are, so set that cadence with your consumers. Ask your implementation partner for a written scope that names the catalog, each engine connector and version, the ingestion path, the table service schedule and the migration test plan. Ask each engine vendor, including any managed platform you use, which format versions and connector features it supports today, and whether that support is GA or preview. Those answers, not general format claims, should decide the rollout order.
How to move between formats without a full rewrite
This sequence turns a format decision into a staged move, so each table changes only after engines, catalog and compatibility have been checked. The result is a documented cutover plan that tells you what is safe to migrate and what still needs a decision.
Inventory engines and write patterns
Your data platform team lists every engine that reads or writes lakehouse tables, such as Spark, Trino, Flink or Presto, and records the write pattern for each table: append-only loads, batch merges, row-level updates and deletes, or streaming upserts with change data capture. Engine versions and the connector each one uses go on the same list. This matters because Iceberg, Delta Lake and Hudi differ most on how updates, deletes and streaming writes are handled, so the write pattern drives the shortlist. The step is done when every engine and table has a named owner and a documented write pattern, and the team agrees which connectors each engine needs.
Map the current catalog and metastore
Your platform team records which catalog holds table definitions today, such as a Hive metastore, AWS Glue, a REST catalog or a vendor-managed catalog, and which engines depend on it. Trino's Iceberg connector supports several catalog types set through iceberg.catalog.type, so the catalog choice can limit which engines can see a table. The owner of the catalog confirms how it handles access control and lineage for each format. The step is complete when the team can state which catalog every table lives in, which engines read through it, and which catalog options each candidate format supports in your environment, confirmed with the vendor or project documentation.
Pilot one representative table
Choose one table that represents the common write pattern, is read by at least two engines, and carries modest business risk. The data engineering team creates a copy in the candidate format, loads it from the same source, and runs the agreed queries and writes. They check row counts, schema behavior, partitioning and any time travel or rollback needs your auditors or analysts rely on. The pilot is done when the copy matches the source for the agreed queries and the team has written down every engine that needed extra configuration or a connector that was in preview.
Test compatibility with UniForm or engine connectors
Where the target format is the one already in use, you can test cross-format reads before moving any data. Delta.io describes UniForm (Delta Universal Format) as a way for Iceberg and Hudi clients to read Delta tables, so a platform team can confirm which readers see the pilot table correctly. Where a connector is needed instead, the team tests the Trino or Flink connector against the pilot and records whether it is documented as preview or production. Engineers confirm read results, write permissions and metadata refresh behavior for each reader. The step closes with a compatibility matrix that lists each engine, format, connector and known gap, with the test evidence attached.
Decide the catalog and governance model
The architecture group chooses the catalog that will hold tables after cutover, weighing which engines it serves, how it handles access control, and who operates it. This decision also sets who owns table definitions, retention, and the audit trail. Migration cost depends heavily on this choice, because a catalog change touches every table and every engine that reads it. The group signs off a written decision record that names the catalog, its operator, its access model and the formats it supports. The step is complete when the record is approved and each pilot engine has been tested against the chosen catalog.
Plan tables in waves
Platform owners group the remaining tables by write pattern, engine dependency and downstream consumers, then schedule them in waves. Low-risk, read-mostly tables go first. Tables with streaming writes, change data capture or heavy row-level deletes move later, once the team has proven the chosen write path on the pilot. Each wave has a rollback point, usually keeping the source table readable until the consumers confirm results. The cost of switching later grows with the number of tables and engines, so the plan should record the count of each for every wave. The plan is done when every table has a wave, an owner and a rollback method.
Run cutover with reconciliation and rollback
For each wave, the data team freezes writes or stages a short window, runs the final load into the target format, and reconciles row counts, key checks and sample queries against the source. Downstream owners confirm their reports and jobs read the new table. The team keeps the source readable until the agreed reconciliation passes, then retires it according to the retention policy. Each cutover ends with a signed reconciliation report and a documented rollback path. The step is complete when every wave has a signed report and the old tables are either archived or removed under the approved retention rules.
Questions buyers ask before choosing a table format
Which open table format works with the most engines?
No single format wins on engine count alone, so check the engines you run today and the ones you expect to add. Apache Iceberg describes itself as a format that lets Spark, Trino, Flink, Presto, Hive and Impala work on the same tables at the same time, and Trino's Iceberg connector supports several catalog types, including Hive metastore, AWS Glue, JDBC, REST, Nessie and Snowflake. Delta Lake lists a similar set of engines, including Spark, Trino, Flink, Hive, Snowflake, BigQuery, Athena and Redshift, but the Trino and Flink connectors have different maturity levels, and the Flink connector is documented as a preview that writes to Delta Lake. Hudi's built-in ingestion targets Spark and Flink users. Confirm the exact connector version, read and write support, and catalog type for each engine in your own environment before deciding.
Does UniForm let Iceberg and Hudi clients read Delta tables?
Yes, according to Delta.io, UniForm (Delta Universal Format) is the feature that lets Iceberg and Hudi clients read Delta tables. This is a read path, so confirm which clients you need, which versions of them support reading UniForm metadata, and whether your writers can keep that metadata current. Test the path with your own engines and table layouts, including partitioning and delete-heavy workloads, before you rely on it for production reads. UniForm also does not remove the need to choose a primary write format for each table, because the write path, catalog configuration and maintenance jobs still belong to one format. Ask the Delta Lake project and your Databricks or other platform team to document the supported combinations.
How does Hudi Merge On Read compaction affect data freshness?
Compaction sets the trade-off between write speed and read freshness in a Merge On Read table. Updates and deletes go to log files, which are merged with base files at query time, and a periodic compaction process folds them into new base files. Hudi's documentation states that read-optimized queries see data only up to the last compaction, so a longer compaction interval means staler results for those queries. Snapshot queries merge logs at read time, which keeps results current but costs more at query time. Your compaction schedule, log file growth and query mix determine freshness. Ask your team to measure lag under real write rates, and confirm how your query engine handles each query type on the Hudi version you plan to run.
Do Iceberg v3 deletion vectors match Hudi record-level indexes?
The supplied sources do not establish how Iceberg v3 deletion vectors compare with Hudi's record-level indexes, so treat any direct equivalence as unverified. Hudi's documentation describes record-level indexes for fast upserts and deletes, and Hudi supports both optimistic and non-blocking concurrency control for streaming writes. For Iceberg, confirm the specification version your engines support, how deletes are recorded, and which engines can read and apply them. The Apache Iceberg releases page is the starting point, and your engine vendor's documentation should confirm read and write support for each delete mechanism. Run a delete-heavy test on your own tables before choosing a format for change data capture.
How much effort does a self-hosted table format take to implement?
The effort depends on the drivers that shape the design, not on a fixed figure. The main drivers are the number of engines and catalogs, whether you need streaming upserts or only batch appends, how often tables are compacted, expired or cleaned, and whether you run table maintenance inline with writers or as separate jobs. Hudi's documentation notes that cleaning, clustering and compaction can run inline with Spark or Flink writers or be operated independently, which changes the operational load. Iceberg and Delta Lake also need decisions about catalog hosting, access control and snapshot retention. No supplied source gives a duration for any of these steps, so ask for a written breakdown by workstream before you plan a schedule.
Can an internal team run a lakehouse table format without outside help?
An internal team can do this when it already runs Spark or Trino in production, has someone who understands catalogs and object storage access, and can own table maintenance after launch. The work usually needs skills in Java or Python, SQL, identity and access control, monitoring and upgrades. Teams that lack those skills, or that must meet audit evidence requirements, often need outside help for design, hardening and documentation. DeployOpen plans, implements, customizes, integrates, hardens, backs up, upgrades, documents and supports self-hosted open-source platforms inside your own infrastructure, usually through fixed-scope work agreed in writing, with ongoing support available as a retainer. Ask any partner to show how knowledge transfers to your team.
What should a table format rollout quote include?
A useful quote lists the scope before the price, so you can compare offers on the same work. Ask for the engines and catalogs in scope, the tables and workloads to migrate or build, the write format choice for each table, and the maintenance jobs that will run after launch. Request the deliverables, including architecture documentation, runbooks, access configuration and test results, plus any upgrade or support terms and what is excluded. Cost components include the time of the engineers doing design and build, the infrastructure you run, and any ongoing retainer. Storage and compute are paid to your cloud or data center provider, and open-source licenses carry no fee for these formats. DeployOpen does not publish a price list. A quote follows from the written scope.
How DeployOpen helps choose and implement a table format
DeployOpen plans, implements and supports self-hosted open-source platforms inside your own cloud accounts, data centers or air-gapped networks, so the table format decision is tested against your engines, catalogs and governance rules before anything is migrated. We start from the workloads you run today and work through the choice between Apache Iceberg, Delta Lake and Apache Hudi in writing, before implementation begins.
How we scope
- We list the engines in use, such as Spark, Trino, Flink or Presto, and confirm which ones must read and write the same tables.
- We record update, delete and streaming ingestion patterns so the format is judged on the write path your team actually runs.
- Engagements are fixed-scope, so the format evaluation, deliverables and timelines are agreed in writing before any work starts.
How we build
- We stand up a proof environment inside your infrastructure with the catalog your team has chosen, such as a Hive metastore, AWS Glue or a REST catalog.
- We test time travel, rollback, schema changes and compaction behavior against your own tables rather than generic sample data.
- We configure table maintenance jobs, access controls and backups so the chosen format runs under your operating model.
How we hand over
- We document the format decision, catalog configuration, engine versions and the reasons each option was accepted or set aside.
- We record the migration path and what a future move to another format would involve, so the switching cost is visible to your team.
- We walk your platform and data engineers through runbooks for maintenance, recovery and upgrades before the handover closes.
How we support
- Ongoing support, upgrades and continuous testing are available as a retainer after the handover.
- We can re-test the format choice when engine versions change, such as a new Trino or Spark release in your stack.
- Ask any provider to confirm engine and catalog support for your exact versions in writing before you commit to a format.

