Iceberg catalogs, revisited #12723
Replies: 3 comments 9 replies
How do
|
What are the major changes in the old → new spec migration?We are removing “write integrations.”This was a Snowflake-specific term that didn’t have much meaning for other catalogs. The original reasoning for this was to make it easier to isolate your staging and production environments, but in practice this made it more difficult to reason about what the configurations were doing. You can get the same behavior by using a single # current spec
catalogs:
- catalog_name: my_first_catalog
# define as many as you want, but you can only have one 'active' integration per invocation
active_write_integration: prod_glue_write_integration # not required if you only have 1 integration
write_integrations:
- integration_name: "{{ env_var('INTEGRATION_NAME') }}"
catalog_type: glue
external_volume: "{{ env_var('EXT_VOLUME') }}"
table_format: iceberg
# new spec
catalogs:
- catalog_name: "{{ env_var('CATALOG_NAME') }}"
catalog_type: glue
config:
snowflake:
external_volume: "{{ env_var('EXT_VOLUME') }}"
table_format: iceberg
|
Next steps & open questionsWe are planning to implement this first in the dbt Fusion engine (across all adapters that support the current There is a significant remaining challenge: Iceberg catalog providers have different, stricter requirements for schema and identifier names: quoted, lowercase, alphanumeric characters only (no underscores!). This is painful — especially on Snowflake, which prefers uppercase & unquoted identifiers whenever possible. We believe this new spec will make it easier for us to handle some of this automatically, but this is an overhaul we still need to do in the future. First - we want to hear your feedback!
|

Uh oh!
There was an error while loading. Please reload this page.
Uh oh!
There was an error while loading. Please reload this page.
Since our last discussion post over a year ago, we have seen expanding support for the Iceberg table format and the Iceberg REST Catalog from data warehouse vendors. dbt now has support for materializing Iceberg tables on three platforms (Snowflake, Databricks, and BigQuery) through the
catalogs.ymlspec we previously defined.But although dbt supports reading and writing Iceberg to one platform at a time, it does not yet support reading Iceberg from one platform and writing to another. In the past year, we’ve seen efforts to add read and write support between warehouses using Iceberg, and we believe Snowflake’s catalog-linked databases are the start of support in dbt for cross-platform workflows.
Setting the Scene
Catalog-linked databases are Snowflake databases that sync metadata from external catalogs through the Iceberg REST API. This creates a bidirectional connection between Snowflake and an external catalog:
We have extensively tested catalog-linked database performance at scale over the past few months: read the blog, and check out our work. We think there is a lot of promise in the construct of a catalog-linked database to drive cross-platform workflows in dbt, but in our research we have seen challenges with the current
catalogs.ymlspecification:Looking back over the past year, as users have adopted
catalogs.ymlinto their projects, we've noticed that the current specification is difficult to work with. Our current spec attempts to abstract over the idea of catalog integrations, but warehouse vendors have different ideas of what the term even means. As a result, configuringcatalogs.ymlfeels unintuitive.With external sources also on the potential future horizon for Iceberg support in dbt, we think that it’s time that
catalogs.ymlgot an upgrade.Our proposal: a new spec
What’s different and why?
From Colin’s post last year: “Broadly speaking, when we say “catalogs,” we are referring to services like Glue Data Catalog or anything that implements Iceberg REST. These services provide a warehouse-agnostic interface for managing data in object storage.”
We had four goals in redesigning the catalog spec:
catalogs.ymlshould represent catalogs, rather than catalog integrations.catalogs.yml-glue | unity | polaris(strongly typed for the catalog providers we have tested and verified), andiceberg_restfor all the rest (Lakekeeper, Nessie, et al).iceberg_resttolakekeeper,nessie, etc.catalogs.yml, because adapter-specific configurations are nested under<adapter_name>keys. (This is an early foray; we have aspirations of introducing adapter-specific configurations more broadly.)catalogs.ymldefined, don’t worry — dbt Core will continue supporting the current spec indefinitely. We are also planning to add support to dbt-autofix to make the old → new spec migration even easier.Here is an example of the current spec:
And here is the same example, rewritten with the new proposed spec:
In the comments below you can find more information about our plans for the new spec, how it differs, from the old spec, and future work:
catalogsenable cross-project, cross-platform workflows?All reactions