Why can't Trino read my Delta table?
Summary
- Trino's Delta Lake connector needs three things to read a table: a metastore entry it can see, file system access to the table's storage, and support for every reader feature in the table's Delta protocol. When a read fails, check those three first.
- The connector reads tables registered in a Hive metastore service or a Glue metastore. To add a table that already exists in storage, set
delta.register-table-procedure.enabled=true(the default isfalse) and callsystem.register_table. - Trino's docs list the Delta table features the connector supports and say "No other features are supported." Compare that list with the table's
tableFeaturesfromDESCRIBE DETAIL; it omits variant, which Trino reads. - Unity Catalog managed tables can't be read by storage path, except through Compatibility Mode (Public Preview). Point Trino's Iceberg connector at the Unity Catalog Iceberg REST catalog instead, after enabling Iceberg reads on the Delta table.
Why can't Trino read my Delta table?
Usually because one of three requirements isn't met. Trino's Delta Lake connector finds tables through a metastore (a Hive metastore service or a Glue metastore), reads their files through a file system you've activated in the catalog, and can't read a table whose Delta protocol lists a reader feature it doesn't implement. Check them in that order. If the table is a Unity Catalog managed table on Databricks, there's a fourth cause: path-based access to managed tables isn't supported because it bypasses Unity Catalog access controls, so read it through a catalog API instead.
Symptom, likely cause and fix
| Symptom | Likely cause | Fix |
|---|---|---|
| The table doesn't appear, or Trino says it doesn't exist | The data is in storage but isn't registered in the metastore the catalog uses | Enable delta.register-table-procedure.enabled and call system.register_table with the table location |
| Storage access fails | No file system support is active; Trino activates none by default | Set fs.s3.enabled, fs.azure.enabled or fs.gcs.enabled to true and configure credentials |
| Queries fail with a protocol or table-feature error | The table uses a reader feature outside the connector's supported list, such as catalogManaged |
Compare tableFeatures with Trino's list; drop the feature on Databricks if it's droppable, or read through the Iceberg REST catalog |
| A Unity Catalog managed table fails when read by path | Path-based access to managed tables isn't supported, except in Compatibility Mode | Use the Iceberg REST catalog, or Compatibility Mode (Public Preview) |
| Reads work but writes fail | The table has writer features the connector doesn't support, such as liquid clustering (clustering) or row tracking (rowTracking) |
Write from an engine that supports those features and keep Trino read-only |
Step 1: check what the table requires
On Databricks, DESCRIBE DETAIL main.sales.orders returns minReaderVersion, minWriterVersion and a tableFeatures list. Under the Delta protocol, readers "must implement and respect all features listed in readerFeatures," while writer-only features don't block read access.
As of the Trino 483 docs, the connector reads column mapping, deletion vectors, timestamp without time zone, type widening, V2 checkpoints, the vacuum protocol check, and Iceberg compatibility V1 and V2. It writes a smaller set. The docs list omits variant, which Trino has read since release 471, and varies by version, so check the docs for your Trino release. Databricks can remove some features with ALTER TABLE <table-name> DROP FEATURE <feature-name> (Databricks Runtime 16.3 or above). That rewrites data files as needed and conflicts with concurrent writes, so only drop a feature you don't rely on.
Step 2: register the table and activate storage
The connector needs network access to the Hive metastore service (Thrift's default port is 9083) or to a Glue metastore. A table that exists only in storage must be registered first. In a catalog file such as etc/catalog/delta.properties:
connector.name=delta_lake
hive.metastore.uri=thrift://example.net:9083
fs.s3.enabled=true
delta.register-table-procedure.enabled=true
-- In Trino: register an existing table from its transaction log and data files
CALL delta.system.register_table(
schema_name => 'sales',
table_name => 'orders',
table_location => 's3://my-bucket/path/orders');
Step 3: for Unity Catalog tables, use the Iceberg REST catalog
Databricks serves external Iceberg clients at /api/2.1/unity-catalog/iceberg-rest. Enable External data access on the metastore and grant the principal EXTERNAL USE SCHEMA on the schema. Then turn on Iceberg reads (UniForm) for the Delta table by setting delta.enableIcebergCompatV2 to true and delta.universalFormat.enabledFormats to iceberg; the table needs column mapping and Unity Catalog registration. In Trino, add an Iceberg catalog file such as etc/catalog/unity.properties:
connector.name=iceberg
iceberg.catalog.type=rest
iceberg.rest-catalog.uri=https://<workspace-url>/api/2.1/unity-catalog/iceberg-rest
iceberg.rest-catalog.warehouse=<uc-catalog-name>
iceberg.rest-catalog.security=OAUTH2
iceberg.rest-catalog.oauth2.token=<token>
iceberg.rest-catalog.vended-credentials-enabled=true
iceberg.security=read_only
Trino's docs require iceberg.security=read_only for this connection, and Iceberg clients get read-only access to Delta tables with Iceberg reads enabled. Databricks also notes that deletion vectors aren't supported for Iceberg v2 reads.
How Databricks approaches external reads
Databricks keeps outside engines on open, governed APIs rather than raw storage paths: the Unity REST API for Delta Lake clients, the Iceberg REST catalog for Iceberg clients, and credential vending for temporary, scoped access. Unity Catalog doesn't govern reads that external systems make directly against cloud object storage; the docs recommend these integrations instead. Before enabling features such as variant on a table that other engines read, confirm those clients support them; Databricks notes that most protocol upgrades are irreversible.
FAQs
Does Trino support Delta Lake deletion vectors?
Yes. The Trino Delta Lake connector docs list deletion vectors as supported for readers and writers. On an older Trino release, check that version's docs.
Can Trino read a Delta table without a metastore?
The connector needs a Hive metastore service or a Glue metastore. A table that already exists in storage can be added with system.register_table, which reuses its transaction log and data files.
Can Trino write to Unity Catalog through the Iceberg REST catalog?
Not according to Trino's docs, which require iceberg.security=read_only when connecting to Databricks Unity Catalog through an Iceberg REST catalog.
Which Databricks Runtime versions does Trino support?
Trino's docs list tables written by Databricks Runtime LTS releases from 7.3 LTS to 17.3 LTS as supported.
The information provided herein is for general informational purposes only and may not reflect the most current product capabilities or configurations.