Перейти к основному содержимому

Конфигурации BigQuery

Использование project и dataset в конфигурациях​

  • schema является взаимозаменяемым с понятием BigQuery dataset
  • database является взаимозаменяемым с понятием BigQuery project

В справочной документации вы можете объявлять project вместо database. Это позволит читать и записывать данные из нескольких BigQuery‑проектов. То же самое относится и к dataset.

Использование партиционирования и кластеризации таблиц​

Предложение PARTITION​

BigQuery поддерживает использование выражения partition by, которое позволяет легко партиционировать table по колонке или выражению. Эта опция помогает снизить задержки и стоимость при запросах к большим таблицам. Обратите внимание, что отсечение партиций (partition pruning) работает только в том случае, если фильтрация партиций выполняется с использованием литеральных значений (то есть выбор партиций через subquery не улучшит производительность).

Конфигурация partition_by может быть задана в виде словаря следующего формата:

{
"field": "<field name>",
"data_type": "<timestamp | date | datetime | int64>",
"granularity": "<hour | day | month | year>"

# Only required if data_type is "int64"
"range": {
"start": <int>,
"end": <int>,
"interval": <int>
}
}

Партиционирование по дате или timestamp​

При использовании колонки типа datetime или timestamp для партиционирования данных вы можете создавать партиции с гранулярностью час, день, месяц или год. Колонка типа date поддерживает гранулярность день, месяц и год. Ежедневное партиционирование является значением по умолчанию для всех типов колонок.

Если data_type указан как date, а гранулярность — day, dbt будет передавать поле без изменений при настройке партиционирования таблицы.

bigquery_table.sql
{{ config(
materialized='table',
partition_by={
"field": "created_at",
"data_type": "timestamp",
"granularity": "day"
}
)}}

select
user_id,
event_name,
created_at

from {{ ref('events') }}

Партиционирование по дате или timestamp загрузки (ingestion)​

BigQuery поддерживает более старый механизм партиционирования, основанный на времени загрузки каждой строки. Хотя мы рекомендуем по возможности использовать более новый и удобный подход к партиционированию, для очень больших наборов данных этот более механистичный подход может дать некоторые улучшения производительности. Подробнее см. описание инкрементальной стратегии insert_overwrite ниже.

dbt всегда инструктирует BigQuery партиционировать таблицу по значениям колонки, указанной в partition_by.field. Если в конфигурации модели указать partition_by.time_ingestion_partitioning равным True, dbt будет использовать эту колонку как вход для псевдоколонки _PARTITIONTIME. В отличие от более нового партиционирования по колонке, в этом случае вы должны убедиться, что значения в колонке партиционирования точно соответствуют временной гранулярности ваших партиций.

bigquery_table.sql
{{ config(
materialized="incremental",
partition_by={
"field": "created_date",
"data_type": "timestamp",
"granularity": "day",
"time_ingestion_partitioning": true
}
) }}

select
user_id,
event_name,
created_at,
-- values of this column must match the data type + granularity defined above
timestamp_trunc(created_at, day) as created_date

from {{ ref('events') }}

Партиционирование с использованием целочисленных диапазонов​

Если data_type указан как int64, необходимо также указать ключ range в словаре partition_by. dbt использует значения, указанные в range, для генерации выражения партиционирования таблицы.

bigquery_table.sql
{{ config(
materialized='table',
partition_by={
"field": "user_id",
"data_type": "int64",
"range": {
"start": 0,
"end": 100,
"interval": 10
}
}
)}}

select
user_id,
event_name,
created_at

from {{ ref('events') }}

Дополнительные настройки партиционирования​

Если для вашей модели настроен partition_by, вы можете дополнительно указать две конфигурации:

  • require_partition_filter (boolean): если установлено в true, любой запрос к этой модели обязан указывать фильтр по партиции, иначе запрос завершится ошибкой. Это рекомендуется для очень больших таблиц с очевидной схемой партиционирования, например потоков событий, сгруппированных по дням. Обратите внимание, что это также повлияет на другие модели или тесты dbt, которые пытаются выбирать данные из этой модели.

  • partition_expiration_days (integer): если задано для партиций типа date или timestamp, партиция истечёт через указанное количество дней после даты, которую она представляет. Например, партиция для 2021-01-01 с истечением через 7 дней перестанет быть доступной для запросов с 2021-01-08, стоимость её хранения станет нулевой, а содержимое со временем будет удалено. Обратите внимание, что если указано истечение всей таблицы, оно будет иметь приоритет.

bigquery_table.sql
{{ config(
materialized = 'table',
partition_by = {
"field": "created_at",
"data_type": "timestamp",
"granularity": "day"
},
require_partition_filter = true,
partition_expiration_days = 7
)}}

Предложение CLUSTERING​

Таблицы BigQuery могут быть кластеризованы для совместного размещения связанных данных.

Кластеризация по одной колонке:

bigquery_table.sql
{{
config(
materialized = "table",
cluster_by = "order_id",
)
}}

select * from ...

Кластеризация по нескольким колонкам:

bigquery_table.sql
{{
config(
materialized = "table",
cluster_by = ["customer_id", "order_id"],
)
}}

select * from ...

Управление шифрованием KMS​

Ключи шифрования, управляемые клиентом, могут быть настроены для таблиц BigQuery с помощью конфигурации модели kms_key_name.

Использование KMS‑шифрования​

Чтобы указать имя KMS‑ключа для модели (или группы моделей), используйте конфигурацию модели kms_key_name. В следующем примере kms_key_name задаётся для всех моделей в директории encrypted/ вашего dbt‑проекта.

dbt_project.yml

name: my_project
version: 1.0.0

...

models:
my_project:
encrypted:
+kms_key_name: 'projects/PROJECT_ID/locations/global/keyRings/test/cryptoKeys/quickstart'

Labels и tags​

Задание labels​

dbt поддерживает задание labels BigQuery для таблиц и представлений, которые он создаёт. Эти labels можно указать с помощью конфигурации модели labels.

Конфигурация labels может быть задана в конфигурации модели или в файле dbt_project.yml, как показано ниже.

Пары ключ‑значение BigQuery для labels длиной более 63 символов обрезаются.

Настройка labels в файле модели

model.sql
{{
config(
materialized = "table",
labels = {'contains_pii': 'yes', 'contains_pie': 'no'}
)
}}

select * from {{ ref('another_model') }}

Настройка labels в dbt_project.yml

dbt_project.yml

models:
my_project:
snowplow:
+labels:
domain: clickstream
finance:
+labels:
domain: finance
Просмотр labels в консоли BigQueryПросмотр labels в консоли BigQuery

Применение labels к заданиям (jobs)​

Хотя конфигурация labels применяет labels к таблицам и представлениям, создаваемым dbt, вы также можете применять labels к BigQuery‑заданиям, которые выполняет dbt. Labels заданий полезны для отслеживания стоимости запросов, мониторинга производительности заданий и организации истории заданий BigQuery по метаданным dbt.

По умолчанию labels не применяются напрямую к заданиям. Однако вы можете включить маркировку заданий через комментарии к запросам, выполнив следующие шаги:

Шаг 1​

Определите макрос query_comment, чтобы добавлять labels в ваши запросы через комментарий:

-- macros/query_comment.sql
{% macro query_comment(node) %}
{%- set comment_dict = {} -%}
{%- do comment_dict.update(
app='dbt',
dbt_version=dbt_version,
profile_name=target.get('profile_name'),
target_name=target.get('target_name'),
) -%}
{%- if node is not none -%}
{%- do comment_dict.update(node.config.get("labels", {})) -%}
{% else %}
{%- do comment_dict.update(node_id='internal') -%}
{%- endif -%}
{% do return(tojson(comment_dict)) %}
{% endmacro %}

Этот макрос создаёт JSON‑комментарий, содержащий метаданные dbt (приложение, версия, профиль, target) и объединяет их с любыми labels, настроенными на уровне модели.

Шаг 2​

Включите маркировку заданий в dbt_project.yml, установив comment: "{{ query_comment(node) }}" и job-label: true в конфигурации query-comment:

# dbt_project.yml
name: analytics
profile: bq
version: "1.0.0"

models:
analytics:
+materialized: table

query-comment:
comment: "{{ query_comment(node) }}"
job-label: true

После включения BigQuery будет разбирать JSON‑комментарий и применять пары ключ‑значение в качестве labels к каждому заданию. Затем вы сможете фильтровать и анализировать задания в консоли BigQuery или через представление INFORMATION_SCHEMA.JOBS, используя эти labels.

Задание tags​

Tags таблиц и представлений BigQuery могут быть созданы путём указания пустой строки в качестве значения label.

model.sql
{{
config(
materialized = "table",
labels = {'contains_pii': ''}
)
}}

select * from {{ ref('another_model') }}

Вы можете создать новый label без значения или удалить значение у существующего ключа label.

Label с ключом, имеющим пустое значение, также может называться tag в BigQuery. Однако это отличается от BigQuery tag, который условно применяет IAM‑политики к таблицам и датасетам BigQuery. Подробнее см. в документации по Tags.

Resource tags​

BigQuery tags позволяют реализовать условный контроль доступа IAM для таблиц и представлений BigQuery. Вы можете применять такие BigQuery tags с помощью конфигурации resource_tags. В этом разделе приведены рекомендации по использованию параметра конфигурации resource_tags.

Resource tags — это пары ключ‑значение, которые должны соответствовать формату тегов BigQuery: {google_cloud_project_id}/{key_name}: value. В отличие от labels, BigQuery tags в первую очередь предназначены для контроля доступа IAM с использованием условных политик, что позволяет организациям:

  • Реализовывать условный контроль доступа: применять IAM‑политики в зависимости от BigQuery tags (например, предоставлять доступ только к таблицам с тегом environment:production).
  • Обеспечивать управление данными: использовать BigQuery tags вместе с IAM‑политиками для защиты чувствительных данных.
  • Управлять доступом в масштабе: единообразно управлять шаблонами доступа в разных проектах и окружениях.

Предварительные требования​

Настройка tags в файле модели​

Пример настройки tags в файле модели:

model.sql
{{
config(
materialized = "table",
resource_tags = {
"my-project-id/environment": "production",
"my-project-id/data_classification": "sensitive",
"my-project-id/access_level": "restricted"
}
)
}}

select * from {{ ref('another_model') }}

Настройка tags в dbt_project.yml​

Пример настройки tags в файле dbt_project.yml:

dbt_project.yml
models:
my_project:
production:
+resource_tags:
my-project-id/environment: production
my-project-id/data_classification: sensitive
staging:
+resource_tags:
my-project-id/environment: staging
my-project-id/data_classification: internal

Совместное использование dbt tags и BigQuery tags​

Вы можете использовать существующую конфигурацию tags в dbt вместе с resource_tags BigQuery:

model.sql
{{
config(
materialized = "materialized_view",
tags = ["reporting", "daily"], # dbt tags for internal organization
resource_tags = { # BigQuery tags for IAM access control
"my-project-id/environment": "production",
"my-project-id/data_classification": "sensitive"
}
)
}}

select * from {{ ref('my_table') }}

Для получения дополнительной информации о настройке условных IAM‑политик с использованием BigQuery tags см. документацию BigQuery по tags.

Policy tags​

BigQuery поддерживает безопасность на уровне колонок за счёт задания policy tags для отдельных колонок.

dbt поддерживает эту возможность как свойство ресурса колонки — policy_tags (не как конфигурацию узла).

models/<filename>.yml

models:
- name: policy_tag_table
columns:
- name: field
policy_tags:
- 'projects/<gcp-project>/locations/<location>/taxonomies/<taxonomy>/policyTags/<tag>'

Обратите внимание, что для того, чтобы policy tags начали действовать, для модели, seed или snapshot должна быть включена настройка column-level persist_docs. Рекомендуется использовать variables для управления таксономиями и убедиться, что к сервисному аккаунту BigQuery добавлены необходимые роли.

Поведение merge (инкрементальные модели)​

Конфигурация incremental_strategy определяет, как dbt строит инкрементальные модели. В BigQuery dbt использует оператор merge для обновления инкрементальных таблиц.

Значение incremental_strategy может быть одним из следующих:

  • merge (по умолчанию)
  • insert_overwrite
  • microbatch

Производительность и стоимость​

Операции, выполняемые dbt при сборке инкрементальной модели BigQuery, можно сделать более дешёвыми и быстрыми, используя кластеризацию в конфигурации модели. Подробнее о тюнинге производительности инкрементальных моделей BigQuery см. в этом руководстве.

Примечание: Эти преимущества по производительности и стоимости применимы к инкрементальным моделям, построенным как со стратегией merge, так и со стратегией insert_overwrite.

Стратегия merge​

Инкрементальная стратегия merge генерирует оператор merge, который выглядит примерно так:

merge into {{ destination_table }} DEST
using ({{ model_sql }}) SRC
on SRC.{{ unique_key }} = DEST.{{ unique_key }}

when matched then update ...
when not matched then insert ...

Подход merge автоматически обновляет новые данные в целевой инкрементальной таблице, но требует сканирования всех исходных таблиц, на которые ссылается SQL модели, а также целевой таблицы. Это может быть медленно и дорого при больших объёмах данных. Упомянутые ранее техники партиционирования и кластеризации помогают смягчить эти проблемы.

Примечание: Конфигурация unique_key обязательна при выборе инкрементальной стратегии merge.

Стратегия insert_overwrite​

Стратегия insert_overwrite генерирует оператор merge, который заменяет целые партиции в целевой таблице. Примечание: эта конфигурация требует, чтобы модель была настроена с использованием Partition clause. Оператор merge, который генерирует dbt при выборе стратегии insert_overwrite, выглядит примерно так:

/*
Create a temporary table from the model SQL
*/
create temporary table {{ model_name }}__dbt_tmp as (
{{ model_sql }}
);

/*
If applicable, determine the partitions to overwrite by
querying the temp table.
*/

declare dbt_partitions_for_replacement array<date>;
set (dbt_partitions_for_replacement) = (
select as struct
array_agg(distinct date(max_tstamp))
from `my_project`.`my_dataset`.{{ model_name }}__dbt_tmp
);

/*
Overwrite partitions in the destination table which match
the partitions in the temporary table
*/
merge into {{ destination_table }} DEST
using {{ model_name }}__dbt_tmp SRC
on FALSE

when not matched by source and {{ partition_column }} in unnest(dbt_partitions_for_replacement)
then delete

when not matched then insert ...

Подробное описание механики этого подхода см. в этом поясняющем посте.

Определение партиций для перезаписи​

dbt может определять партиции для перезаписи динамически на основе значений, присутствующих во временной таблице, либо статически — с использованием пользовательской конфигурации.

«Динамический» подход является самым простым (и используется по умолчанию), однако «статический» подход позволяет снизить стоимость за счёт исключения нескольких запросов в скрипте сборки модели.

Статические партиции​

Чтобы задать статический список партиций для перезаписи, используйте конфигурацию partitions.

models/session.sql
{% set partitions_to_replace = [
'timestamp(current_date)',
'timestamp(date_sub(current_date, interval 1 day))'
] %}

{{
config(
materialized = 'incremental',
incremental_strategy = 'insert_overwrite',
partition_by = {'field': 'session_start', 'data_type': 'timestamp'},
partitions = partitions_to_replace
)
}}

with events as (

select * from {{ref('events')}}

{% if is_incremental() %}
-- recalculate yesterday + today
where timestamp_trunc(event_timestamp, day) in ({{ partitions_to_replace | join(',') }})
{% endif %}

),

... rest of model ...

Этот пример модели каждый день заменяет данные в целевой таблице как за сегодня, так и за вчера. Это самый быстрый и дешёвый способ инкрементального обновления таблицы с помощью dbt. Если бы мы хотели сделать это более динамичным образом — например, всегда за последние 3 дня, — мы могли бы использовать встроенные в dbt datetime‑макросы и написать несколько собственных.

Это можно рассматривать как режим «полного контроля». Вы должны убедиться, что выражения или литеральные значения в конфигурации partitions корректно экранированы при шаблонизации и соответствуют partition_by.data_type (timestamp, datetime, date или int64). В противном случае фильтр в инкрементальном операторе merge приведёт к ошибке.

Динамические партиции​

Если конфигурация partitions не указана, dbt выполнит следующие шаги:

  1. Создаст временную таблицу на основе SQL модели
  2. Выполнит запрос к временной таблице, чтобы определить уникальные партиции для перезаписи
  3. Выполнит запрос к целевой таблице, чтобы найти максимальную партицию в базе данных

При написании SQL модели вы можете воспользоваться интроспекцией, выполняемой dbt, чтобы отфильтровать только новые данные. Максимальное значение в партиционированном поле целевой таблицы будет доступно через переменную BigQuery _dbt_max_partition. Примечание: это SQL‑переменная BigQuery, а не Jinja‑переменная dbt, поэтому для доступа к ней не требуются фигурные скобки Jinja.

Пример SQL модели:

{{
config(
materialized = 'incremental',
partition_by = {'field': 'session_start', 'data_type': 'timestamp'},
incremental_strategy = 'insert_overwrite'
)
}}

with events as (

select * from {{ref('events')}}

{% if is_incremental() %}

-- recalculate latest day's data + previous
-- NOTE: The _dbt_max_partition variable is used to introspect the destination table
where date(event_timestamp) >= date_sub(date(_dbt_max_partition), interval 1 day)

{% endif %}

),

... rest of model ...

Копирование партиций​

Если при инкрементальных запусках вы заменяете целые партиции, вы можете использовать copy table API и декораторы партиций вместо оператора merge. Хотя этот механизм не предоставляет такой же прозрачности и удобства отладки, как SQL‑оператор merge, он может дать значительную экономию времени и средств для больших наборов данных, поскольку copy table API не взимает плату за вставку данных — это эквивалент команды bq cp в интерфейсе командной строки gcloud (CLI).

Вы можете включить этот режим, установив copy_partitions: True в конфигурации partition_by. Этот подход работает только в сочетании с «динамической» заменой партиций.

bigquery_table.sql
{{ config(
materialized="incremental",
incremental_strategy="insert_overwrite",
partition_by={
"field": "created_date",
"data_type": "timestamp",
"granularity": "day",
"time_ingestion_partitioning": true,
"copy_partitions": true
}
) }}

select
user_id,
event_name,
created_at,
-- values of this column must match the data type + granularity defined above
timestamp_trunc(created_at, day) as created_date

from {{ ref('events') }}
logs/dbt.log
...
[0m16:03:13.017641 [debug] [Thread-3 (]: BigQuery adapter: Copying table(s) "/projects/projectname/datasets/analytics/tables/bigquery_table__dbt_tmp$20230112" to "/projects/projectname/datasets/analytics/tables/bigquery_table$20230112" with disposition: "WRITE_TRUNCATE"
...

Управление сроком хранения таблиц​

По умолчанию таблицы, созданные dbt, никогда не истекают. Вы можете настроить отдельные модели на истечение через заданное количество часов, установив hours_to_expiration.

Note

Параметр hours_to_expiration применяется только при первоначальном создании таблицы. Он не сбрасывается для инкрементальных моделей при последующих запусках.

dbt_project.yml
models:
<resource-path>:
+hours_to_expiration: 6

models/<modelname>.sql

{{ config(
hours_to_expiration = 6
) }}

select ...

Авторизованные представления (Authorized views)​

Если для модели, материализованной как представление (view), указана конфигурация grant_access_to, dbt предоставит модели представления доступ на SELECT к списку указанных датасетов. Подробнее см. документацию BigQuery об авторизованных представлениях.

Note

Конфигурации grants и grant_access_to различны.

  • grant_access_to: Позволяет настроить авторизованные представления. При настройке dbt предоставляет доступ к авторизованному представлению для отображения частичной информации из других наборов данных, не предоставляя конечным пользователям полного доступа к этим исходным наборам данных. Для получения дополнительной информации см. "Конфигурации BigQuery: Авторизованные представления"
  • grants: Предоставляет конкретные разрешения пользователям, группам или сервисным аккаунтам для управления доступом к наборам данных, которые вы создаете с помощью dbt. Для получения дополнительной информации см. "Конфигурации ресурсов: grants"

Вы можете использовать обе функции вместе: "авторизовать" модель представления с помощью конфигурации grant_access_to, а затем добавить grants к этой модели представления, чтобы поделиться результатами её запросов (и только результатами её запросов) с другими пользователями, группами или сервисными аккаунтами.

dbt_project.yml
models:
<resource-path>:
+grant_access_to:
- project: project_1
dataset: dataset_1
- project: project_2
dataset: dataset_2
models/<modelname>.sql

{{ config(
grant_access_to=[
{'project': 'project_1', 'dataset': 'dataset_1'},
{'project': 'project_2', 'dataset': 'dataset_2'}
]
) }}

Представления с такой конфигурацией смогут выполнять SELECT из объектов в project_1.dataset_1 и project_2.dataset_2, даже если они физически расположены в другом месте и запрашиваются пользователями, которые в противном случае не имеют доступа к project_1.dataset_1 и project_2.dataset_2.

Материализованные представления (Materialized views)​

Адаптер BigQuery поддерживает материализованные представления со следующими параметрами конфигурации:

ПараметрТипОбязательныйПо умолчаниюПоддержка мониторинга изменений
on_configuration_change<string>нетapplyn/a
cluster_by[<string>]нетnonedrop/create
partition_by{<dictionary>}нетnonedrop/create
enable_refresh<boolean>нетtruealter
refresh_interval_minutes<float>нет30alter
max_staleness (Preview)<interval>нетnonealter
description<string>нетnonealter
labels{<string>: <string>}нетnonealter
resource_tags{<string>: <string>}нетnonealter
hours_to_expiration<integer>нетnonealter
kms_key_name<string>нетnonealter
Loading table...
dbt_project.yml
models:
<resource-path>:
+materialized: materialized_view
+on_configuration_change: apply | continue | fail
+cluster_by: <field-name> | [<field-name>]
+partition_by:
- field: <field-name>
- data_type: timestamp | date | datetime | int64
# only if `data_type` is not 'int64'
- granularity: hour | day | month | year
# only if `data_type` is 'int64'
- range:
- start: <integer>
- end: <integer>
- interval: <integer>
+enable_refresh: true | false
+refresh_interval_minutes: <float>
+max_staleness: <interval>
+description: <string>
+labels: {<label-name>: <label-value>}
+resource_tags: {<tag-key>: <tag-value>}
+hours_to_expiration: <integer>
+kms_key_name: <path-to-key>

Многие из этих параметров соответствуют аналогичным параметрам для таблиц и были связаны выше. Набор параметров, уникальных для материализованных представлений, охватывает функциональность автообновления.

Подробнее об этих параметрах см. в документации BigQuery:

Автообновление (Auto-refresh)​

ПараметрТипОбязательныйПо умолчаниюПоддержка мониторинга изменений
enable_refresh<boolean>нетtruealter
refresh_interval_minutes<float>нет30alter
max_staleness (Preview)<interval>нетnonealter
Loading table...

BigQuery поддерживает конфигурацию автоматического обновления для материализованных представлений. По умолчанию материализованное представление автоматически обновляется в течение 5 минут после изменений в базовой таблице, но не чаще чем один раз в 30 минут. BigQuery официально поддерживает настройку только частоты обновления (то есть «не чаще одного раза в 30 минут»); однако в режиме Preview доступна возможность настройки допустимой устарелости данных (staleness), то есть «обновление через 5 минут». dbt отслеживает изменения этих параметров и применяет их с помощью оператора ALTER.

Подробнее см. документацию BigQuery:

Ограничения​

Как и на большинстве платформ обработки данных, у материализованных представлений есть ограничения. Среди наиболее важных:

  • SQL для материализованных представлений имеет ограниченный набор возможностей.
  • SQL материализованного представления нельзя изменить; требуется --full-refresh (DROP/CREATE).
  • Параметр partition_by у материализованного представления должен совпадать с параметром базовой таблицы.
  • Материализованные представления могут иметь описание, но столбцы материализованного представления — нет.
  • Пересоздание или удаление базовой таблицы требует пересоздания или удаления материализованного представления.

Дополнительную информацию об ограничениях см. в документации BigQuery.

Конфигурация Python-моделей​

Способы отправки заданий (Submission methods): BigQuery поддерживает несколько механизмов для выполнения Python-кода, каждый со своими преимуществами. Адаптер dbt-bigquery использует BigQuery DataFrames (BigFrames) или Dataproc. В этом процессе данные считываются из BigQuery, вычисления выполняются либо нативно с помощью BigQuery DataFrames, либо в Dataproc, а результаты записываются обратно в BigQuery.

BigQuery DataFrames позволяют выполнять код pandas и scikit-learn. Нет необходимости управлять инфраструктурой, при этом используются распределённые движки запросов BigQuery. Это отличный вариант для аналитиков, дата-сайентистов и ML-инженеров, которым нужно работать с большими объёмами данных с помощью синтаксиса, похожего на pandas.

Примечание: BigQuery DataFrames выполняются в стандартной среде выполнения Google Colab. Если шаблон runtime с именем default недоступен, адаптер автоматически создаст его и пометит как default для последующего использования (при наличии необходимых прав).

Настройка BigQuery DataFrames:

# IAM permission if using service account

#Create Service Account
gcloud iam service-accounts create dbt-bigframes-sa
#Grant BigQuery User Role
gcloud projects add-iam-policy-binding ${GOOGLE_CLOUD_PROJECT} --member=serviceAccount:dbt-bigframes-sa@${GOOGLE_CLOUD_PROJECT}.iam.gserviceaccount.com --role=roles/bigquery.user
#Grant BigQuery Data Editor role. This can be restricted at dataset level
gcloud projects add-iam-policy-binding ${GOOGLE_CLOUD_PROJECT} --member=serviceAccount:dbt-bigframes-sa@${GOOGLE_CLOUD_PROJECT}.iam.gserviceaccount.com --role=roles/bigquery.dataEditor
#Grant Service Account user
gcloud projects add-iam-policy-binding ${GOOGLE_CLOUD_PROJECT} --member=serviceAccount:dbt-bigframes-sa@${GOOGLE_CLOUD_PROJECT}.iam.gserviceaccount.com --role=roles/iam.serviceAccountUser
#Grant Colab Entperprise User
gcloud projects add-iam-policy-binding ${GOOGLE_CLOUD_PROJECT} --member=serviceAccount:dbt-bigframes-sa@${GOOGLE_CLOUD_PROJECT}.iam.gserviceaccount.com --role=roles/aiplatform.colabEnterpriseUser
dbt_project.yml
models:
my_dbt_project:
submission_method: bigframes
profiles.yml
my_dbt_project_sa:
outputs:
dev:
compute_region: us-central1
dataset: <BIGQUERY_DATESET>
gcs_bucket: <GCS BUCKET USED FOR BIGFRAME LOGS>
job_execution_timeout_seconds: 300
job_retries: 1
keyfile: <SERVICE ACCOUNT KEY FILE>
location: US
method: service-account
priority: interactive
project: <BIGQUERY_PROJECT>
threads: 1
type: bigquery
target: dev

Дополнительные параметры​

Python-модели BigQuery также поддерживают следующие дополнительные параметры конфигурации:

ПараметрТипОбязательныйПо умолчаниюДопустимые значения
enable_list_inference<boolean>нетTrueTrue, False
intermediate_format<string>нетparquetparquet, orc
submission_method<string>нет``serverless, bigframes, cluster
notebook_template_id<Integer>нет``<NOTEBOOK RUNTIME TEMPLATE_ID>
compute_region<string>нет``<COMPUTE_REGION>
gcs_bucket<string>нет``<GCS_BUCKET>
packages<string>нет``['numpy<=1.1.1', 'pandas', 'mlflow']
enable_change_history<boolean>нет``True, False
Loading table...
  • Параметр enable_list_inference

    • Включает возможность чтения нескольких записей за одну операцию в PySpark DataFrame. По умолчанию установлен в True для поддержки формата intermediate_format по умолчанию (parquet).
  • Параметр intermediate_format

    • Определяет формат файлов, используемый при записи данных в таблицу. По умолчанию используется parquet.
  • Параметр submission_method

    • Определяет, будет ли задание выполняться в BigQuery DataFrames или в Serverless Spark. Параметр не обязателен, если задан dataproc_cluster_name.
  • Параметр notebook_template_id

    • Указывает шаблон runtime в Colab Enterprise.
  • Параметр compute_region

    • Определяет регион выполнения задания.
  • Параметр gcs_bucket

    • Указывает GCS bucket, используемый для хранения артефактов задания.
  • Параметр enable_change_history

    • Включает функцию истории изменений BigQuery, которая отслеживает изменения, внесённые в таблицу BigQuery. При включении можно использовать историю изменений для аудита и отладки поведения инкрементальных моделей.

Связанная документация:

Ограничения unit-тестов​

Для unit-тестов необходимо указывать все поля в BigQuery STRUCT. Использовать только подмножество полей в STRUCT нельзя.

Нашли ошибку?

0
Loading