Конфигурации BigQuery
Использование project
и dataset
в конфигурациях
schema
взаимозаменяемо с понятием BigQuerydataset
database
взаимозаменяемо с понятием BigQueryproject
Для нашей справочной документации вы можете объявить project
вместо database
. Это позволит вам читать и записывать данные из нескольких проектов BigQuery. То же самое касается dataset
.
Использование разбиения и кластеризации таблиц
Разделение на части
BigQuery поддерживает использование разделения на части для легкого разбиения по столбцу или выражению. Эта опция может помочь уменьшить задержку и стоимость при запросе больших таблиц. Обратите внимание, что обрезка разделов работает только тогда, когда разделы фильтруются с использованием литеральных значений (поэтому выбор разделов с использованием не улучшит производительность).
Конфигурация partition_by
может быть предоставлена в виде словаря следующего формата:
{
"field": "<field name>",
"data_type": "<timestamp | date | datetime | int64>",
"granularity": "<hour | day | month | year>"
# Обязательно, если data_type равно "int64"
"range": {
"start": <int>,
"end": <int>,
"interval": <int>
}
}
Разделение по дате или временной метке
При использовании столбца datetime
или timestamp
для разбиения данных вы можете создавать разделы с гранулярностью час, день, месяц или год. Столбец date
поддерживает гранулярность день, месяц и год. Ежедневное разбиение является значением по умолчанию для всех типов столбцов.
Если data_type
указано как date
и гранулярность — день, dbt предоставит поле как есть при настройке разбиения таблицы.
- Исходный код
- Скомпилированный код
{{ config(
materialized='table',
partition_by={
"field": "created_at",
"data_type": "timestamp",
"granularity": "day"
}
)}}
select
user_id,
event_name,
created_at
from {{ ref('events') }}
create table `projectname`.`analytics`.`bigquery_table`
partition by timestamp_trunc(created_at, day)
as (
select
user_id,
event_name,
created_at
from `analytics`.`events`
)
Разделение по дате или временной метке "ингестации"
BigQuery поддерживает старый механизм разбиения, основанный на времени, когда каждая строка была загружена. Хотя мы рекомендуем использовать новый и более удобный подход к разбиению, когда это возможно, для очень больших наборов данных может быть некоторое улучшение производительности при использовании этого старого, более механистического подхода. Подробнее о стратегии insert_overwrite
ниже.
dbt всегда будет инструктировать BigQuery разбивать вашу таблицу по значениям столбца, указанного в partition_by.field
. Настроив вашу модель с partition_by.time_ingestion_partitioning
, установленным в True
, dbt будет использовать этот столбец в качестве входных данных для псевдостолбца _PARTITIONTIME
. В отличие от нового разбиения на основе столбцов, вы должны убедиться, что значения вашего столбца разбиения точно соответствуют временной гранулярности ваших разделов.
- Исходный код
- Скомпилированный код
{{ config(
materialized="incremental",
partition_by={
"field": "created_date",
"data_type": "timestamp",
"granularity": "day",
"time_ingestion_partitioning": true
}
) }}
select
user_id,
event_name,
created_at,
-- значения этого столбца должны соответствовать типу данных + гранулярности, определенной выше
timestamp_trunc(created_at, day) as created_date
from {{ ref('events') }}
create table `projectname`.`analytics`.`bigquery_table` (`user_id` INT64, `event_name` STRING, `created_at` TIMESTAMP)
partition by timestamp_trunc(_PARTITIONTIME, day);
insert into `projectname`.`analytics`.`bigquery_table` (_partitiontime, `user_id`, `event_name`, `created_at`)
select created_date as _partitiontime, * EXCEPT(created_date) from (
select
user_id,
event_name,
created_at,
-- значения этого столбца должны соответствовать гранулярности, определенной выше
timestamp_trunc(created_at, day) as created_date
from `projectname`.`analytics`.`events`
);