Skip to content

Commit 84890ad

Browse files
bigquery storage_uri updates (#1129)
1 parent 2cfb72c commit 84890ad

File tree

13 files changed

+251
-64
lines changed

13 files changed

+251
-64
lines changed
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
kind: Features
2+
body: generate storage_uri from external_volume, base_location_root and base_location_subpath
3+
time: 2025-05-29T09:29:32.913024-07:00
4+
custom:
5+
Author: colin-rogers-dbt
6+
Issue: "1129"
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
kind: Under the Hood
2+
body: populate file_format from top level integration config field
3+
time: 2025-06-03T11:47:05.292026-07:00
4+
custom:
5+
Author: colin-rogers-dbt
6+
Issue: "1129"
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
kind: Under the Hood
2+
body: Rename and separate out info schema and biglake catalog integrations
3+
time: 2025-06-03T11:47:46.831408-07:00
4+
custom:
5+
Author: colin-rogers-dbt
6+
Issue: "1129"
Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,3 @@
1-
from dbt.adapters.bigquery.catalogs._generic import (
2-
BigQueryCatalogIntegration,
3-
BigQueryCatalogRelation,
4-
)
1+
from dbt.adapters.bigquery.catalogs._biglake_metastore import BigLakeCatalogIntegration
2+
from dbt.adapters.bigquery.catalogs._info_schema import BigQueryInfoSchemaCatalogIntegration
3+
from dbt.adapters.bigquery.catalogs._relation import BigQueryCatalogRelation
Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
from typing import Optional
2+
3+
from dbt.adapters.catalogs import CatalogIntegration
4+
from dbt.adapters.contracts.relation import RelationConfig
5+
6+
from dbt.adapters.bigquery import constants
7+
from dbt.adapters.bigquery.catalogs._relation import BigQueryCatalogRelation
8+
9+
10+
class BigLakeCatalogIntegration(CatalogIntegration):
11+
catalog_type = constants.BIGLAKE_CATALOG_TYPE
12+
allows_writes = True
13+
14+
def build_relation(self, model: RelationConfig) -> BigQueryCatalogRelation:
15+
"""
16+
Args:
17+
model: `config.model` (not `model`) from the jinja context
18+
"""
19+
20+
return BigQueryCatalogRelation(
21+
catalog_type=self.catalog_type,
22+
catalog_name=self.catalog_name,
23+
table_format=self.table_format,
24+
file_format=self.file_format,
25+
external_volume=self.external_volume,
26+
storage_uri=self._calculate_storage_uri(model),
27+
)
28+
29+
def _calculate_storage_uri(self, model: RelationConfig) -> Optional[str]:
30+
if not model.config:
31+
return None
32+
33+
if model_storage_uri := model.config.get("storage_uri"):
34+
return model_storage_uri
35+
36+
if not self.external_volume:
37+
return None
38+
39+
prefix = model.config.get("base_location_root") or "_dbt"
40+
storage_uri = f"{self.external_volume}/{prefix}/{model.schema}/{model.name}"
41+
if suffix := model.config.get("base_location_subpath"):
42+
storage_uri = f"{storage_uri}/{suffix}"
43+
return storage_uri

dbt-bigquery/src/dbt/adapters/bigquery/catalogs/_generic.py

Lines changed: 0 additions & 50 deletions
This file was deleted.
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
from dbt.adapters.catalogs import CatalogIntegration
2+
from dbt.adapters.contracts.relation import RelationConfig
3+
4+
from dbt.adapters.bigquery import constants
5+
from dbt.adapters.bigquery.catalogs._relation import BigQueryCatalogRelation
6+
7+
8+
class BigQueryInfoSchemaCatalogIntegration(CatalogIntegration):
9+
catalog_type = constants.DEFAULT_INFO_SCHEMA_CATALOG.catalog_type
10+
allows_writes = True
11+
12+
def build_relation(self, model: RelationConfig) -> BigQueryCatalogRelation:
13+
"""
14+
Args:
15+
model: `config.model` (not `model`) from the jinja context
16+
"""
17+
18+
return BigQueryCatalogRelation(
19+
catalog_type=self.catalog_type,
20+
catalog_name=self.catalog_name,
21+
table_format=self.table_format,
22+
file_format=self.file_format,
23+
external_volume=None,
24+
storage_uri=None,
25+
)
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
from dataclasses import dataclass
2+
from typing import Optional
3+
4+
from dbt.adapters.catalogs import CatalogRelation
5+
6+
from dbt.adapters.bigquery import constants
7+
8+
9+
@dataclass
10+
class BigQueryCatalogRelation(CatalogRelation):
11+
catalog_type: str = constants.DEFAULT_INFO_SCHEMA_CATALOG.catalog_type
12+
catalog_name: Optional[str] = constants.DEFAULT_INFO_SCHEMA_CATALOG.name
13+
table_format: Optional[str] = constants.INFO_SCHEMA_TABLE_FORMAT
14+
file_format: Optional[str] = constants.INFO_SCHEMA_FILE_FORMAT
15+
external_volume: Optional[str] = None
16+
storage_uri: Optional[str] = None

dbt-bigquery/src/dbt/adapters/bigquery/constants.py

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -12,22 +12,24 @@
1212
PARQUET_FILE_FORMAT = "parquet"
1313

1414

15-
GENERIC_CATALOG_TYPE = "generic"
15+
BIGLAKE_CATALOG_TYPE = "biglake_metastore"
1616

1717

1818
DEFAULT_INFO_SCHEMA_CATALOG = SimpleNamespace(
1919
name="info_schema",
2020
catalog_name="info_schema",
21-
catalog_type=GENERIC_CATALOG_TYPE,
21+
catalog_type="INFO_SCHEMA", # these don't show up in BigQuery; this is a dbt convention
2222
table_format=INFO_SCHEMA_TABLE_FORMAT,
2323
external_volume=None,
2424
file_format=INFO_SCHEMA_FILE_FORMAT,
25+
adapter_properties={},
2526
)
2627
DEFAULT_ICEBERG_CATALOG = SimpleNamespace(
2728
name="managed_iceberg",
2829
catalog_name="managed_iceberg",
29-
catalog_type=GENERIC_CATALOG_TYPE,
30+
catalog_type=BIGLAKE_CATALOG_TYPE,
3031
table_format=ICEBERG_TABLE_FORMAT,
3132
external_volume=None,
3233
file_format=PARQUET_FILE_FORMAT,
34+
adapter_properties={},
3335
)

dbt-bigquery/src/dbt/adapters/bigquery/impl.py

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,8 @@
5757

5858
from dbt.adapters.bigquery import constants, parse_model
5959
from dbt.adapters.bigquery.catalogs import (
60-
BigQueryCatalogIntegration,
60+
BigLakeCatalogIntegration,
61+
BigQueryInfoSchemaCatalogIntegration,
6162
BigQueryCatalogRelation,
6263
)
6364
from dbt.adapters.bigquery.column import BigQueryColumn, get_nested_column_data_types
@@ -136,7 +137,7 @@ class BigQueryAdapter(BaseAdapter):
136137

137138
AdapterSpecificConfigs = BigqueryConfig
138139

139-
CATALOG_INTEGRATIONS = [BigQueryCatalogIntegration]
140+
CATALOG_INTEGRATIONS = [BigLakeCatalogIntegration, BigQueryInfoSchemaCatalogIntegration]
140141
CONSTRAINT_SUPPORT = {
141142
ConstraintType.check: ConstraintSupport.NOT_SUPPORTED,
142143
ConstraintType.not_null: ConstraintSupport.ENFORCED,
@@ -816,7 +817,7 @@ def get_table_options(
816817
if catalog_relation.table_format == constants.ICEBERG_TABLE_FORMAT:
817818
opts["table_format"] = f"'{catalog_relation.table_format}'"
818819
opts["file_format"] = f"'{catalog_relation.file_format}'"
819-
opts["storage_uri"] = f"'{catalog_relation.external_volume}'"
820+
opts["storage_uri"] = f"'{catalog_relation.storage_uri}'"
820821

821822
return opts
822823

0 commit comments

Comments
 (0)