Конфигурации Vertica
Конфигурация инкрементальных моделей
Использование параметра конфигурации on_schema_change
Вы можете использовать параметр on_schema_change
со значениями ignore
, fail
и append_new_columns
. Значение sync_all_columns
в настоящее время не поддерживается.
Конфигурация параметра ignore
(по умолчанию)
- Исходный код
- Код выполнения
{{config(materialized = 'incremental',on_schema_change='ignore')}}
select * from {{ ref('seed_added') }}
insert into "VMart"."public"."merge" ("id", "name", "some_date")
(
select "id", "name", "some_date"
from "merge__dbt_tmp"
)
Конфигурация параметра fail
- Исходный код
- Код выполнения
{{config(materialized = 'incremental',on_schema_change='fail')}}
select * from {{ ref('seed_added') }}
The source and target schemas on this incremental model are out of sync!
They can be reconciled in several ways:
- set the `on_schema_change` config to either append_new_columns or sync_all_columns, depending on your situation.
- Re-run the incremental model with `full_refresh: True` to update the target schema.
- update the schema manually and re-run the process.
Additional troubleshooting context:
Source columns not in target: {{ schema_changes_dict['source_not_in_target'] }}
Target columns not in source: {{ schema_changes_dict['target_not_in_source'] }}
New column types: {{ schema_changes_dict['new_target_types'] }}
Конфигурация параметра append_new_columns
- Исходный код
- Код выполнения
{{ config( materialized='incremental', on_schema_change='append_new_columns') }}
select * from public.seed_added
insert into "VMart"."public"."over" ("id", "name", "some_date", "w", "w1", "t1", "t2", "t3")
(
select "id", "name", "some_date", "w", "w1", "t1", "t2", "t3"
from "over__dbt_tmp"
)
Использование параметра конфигурации incremental_strategy
Стратегия append
(по умолчанию):
Вставка новых записей без обновления или перезаписи существующих данных. append
добавляет только новые записи на основе условия, указанного в условном блоке is_incremental()
.
- Исходный код
- Код выполнения
{{ config( materialized='incremental', incremental_strategy='append' ) }}
select * from public.product_dimension
{% if is_incremental() %}
where product_key > (select max(product_key) from {{this }})
{% endif %}
insert into "VMart"."public"."samp" (
"product_key", "product_version", "product_description", "sku_number", "category_description",
"department_description", "package_type_description", "package_size", "fat_content", "diet_type",
"weight", "weight_units_of_measure", "shelf_width", "shelf_height", "shelf_depth", "product_price",
"product_cost", "lowest_competitor_price", "highest_competitor_price", "average_competitor_price", "discontinued_flag")
(
select "product_key", "product_version", "product_description", "sku_number", "category_description", "department_description", "package_type_description", "package_size", "fat_content", "diet_type", "weight", "weight_units_of_measure", "shelf_width", "shelf_height", "shelf_depth", "product_price", "product_cost", "lowest_competitor_price", "highest_competitor_price", "average_competitor_price", "discontinued_flag"
from "samp__dbt_tmp"
)
Стратегия merge
:
Сопоставление записей на основе unique_key
; обновление старых записей, вставка новых. (Если unique_key
не указан, все новые данные вставляются, аналогично append
.) Параметр конфигурации unique_key
обязателен для использования стратегии merge
, значение, принимаемое этим параметром, — это один столбец таблицы.
- Исходный код
- Код выполнения
{{ config( materialized = 'incremental', incremental_strategy = 'merge', unique_key='promotion_key' ) }}
select * FROM public.promotion_dimension
merge into "VMart"."public"."samp" as DBT_INTERNAL_DEST using "samp__dbt_tmp" as DBT_INTERNAL_SOURCE
on DBT_INTERNAL_DEST."promotion_key" = DBT_INTERNAL_SOURCE."promotion_key"
when matched then update set
"promotion_key" = DBT_INTERNAL_SOURCE."promotion_key", "price_reduction_type" = DBT_INTERNAL_SOURCE."price_reduction_type", "promotion_media_type" = DBT_INTERNAL_SOURCE."promotion_media_type", "display_type" = DBT_INTERNAL_SOURCE."display_type", "coupon_type" = DBT_INTERNAL_SOURCE."coupon_type", "ad_media_name" = DBT_INTERNAL_SOURCE."ad_media_name", "display_provider" = DBT_INTERNAL_SOURCE."display_provider", "promotion_cost" = DBT_INTERNAL_SOURCE."promotion_cost", "promotion_begin_date" = DBT_INTERNAL_SOURCE."promotion_begin_date", "promotion_end_date" = DBT_INTERNAL_SOURCE."promotion_end_date"
when not matched then insert
("promotion_key", "price_reduction_type", "promotion_media_type", "display_type", "coupon_type",
"ad_media_name", "display_provider", "promotion_cost", "promotion_begin_date", "promotion_end_date")
values
(
DBT_INTERNAL_SOURCE."promotion_key", DBT_INTERNAL_SOURCE."price_reduction_type", DBT_INTERNAL_SOURCE."promotion_media_type", DBT_INTERNAL_SOURCE."display_type", DBT_INTERNAL_SOURCE."coupon_type", DBT_INTERNAL_SOURCE."ad_media_name", DBT_INTERNAL_SOURCE."display_provider", DBT_INTERNAL_SOURCE."promotion_cost", DBT_INTERNAL_SOURCE."promotion_begin_date", DBT_INTERNAL_SOURCE."promotion_end_date"
)
Использование параметра конфигурации merge_update_columns
Параметр конфигурации merge_update_columns
передается для обновления только указанных столбцов и принимает список столбцов таблицы.
- Исходный код
- Код выполнения
{{ config( materialized = 'incremental', incremental_strategy='merge', unique_key = 'id', merge_update_columns = ["names", "salary"] )}}
select * from {{ref('seed_tc1')}}
merge into "VMart"."public"."test_merge" as DBT_INTERNAL_DEST using "test_merge__dbt_tmp" as DBT_INTERNAL_SOURCE on DBT_INTERNAL_DEST."id" = DBT_INTERNAL_SOURCE."id"
when matched then update set
"names" = DBT_INTERNAL_SOURCE."names", "salary" = DBT_INTERNAL_SOURCE."salary"
when not matched then insert
("id", "names", "salary")
values
(
DBT_INTERNAL_SOURCE."id", DBT_INTERNAL_SOURCE."names", DBT_INTERNAL_SOURCE."salary"
)
Стратегия delete+insert
:
С помощью инкрементальной стратегии delete+insert
вы можете указать dbt использовать двухэтапный инкрементальный подход. Сначала он удалит записи, обнаруженные через настроенный блок is_incremental()
, а затем повторно вставит их. Параметр unique_key
обязателен для использования стратегии delete+insert
, который указывает, как обновлять записи при наличии дублированных данных. Значение, принимаемое этим параметром, — это один столбец таблицы.
- Исходный код
- Код выполнения
{{ config( materialized = 'incremental', incremental_strategy = 'delete+insert', unique_key='date_key' ) }}
select * FROM public.date_dimension
delete from "VMart"."public"."samp"
where (
date_key) in (
select (date_key)
from "samp__dbt_tmp"
);
insert into "VMart"."public"."samp" (
"date_key", "date", "full_date_description", "day_of_week", "day_number_in_calendar_month", "day_number_in_calendar_year", "day_number_in_fiscal_month", "day_number_in_fiscal_year", "last_day_in_week_indicator", "last_day_in_month_indicator", "calendar_week_number_in_year", "calendar_month_name", "calendar_month_number_in_year", "calendar_year_month", "calendar_quarter", "calendar_year_quarter", "calendar_half_year", "calendar_year", "holiday_indicator", "weekday_indicator", "selling_season")
(
select "date_key", "date", "full_date_description", "day_of_week", "day_number_in_calendar_month", "day_number_in_calendar_year", "day_number_in_fiscal_month", "day_number_in_fiscal_year", "last_day_in_week_indicator", "last_day_in_month_indicator", "calendar_week_number_in_year", "calendar_month_name", "calendar_month_number_in_year", "calendar_year_month", "calendar_quarter", "calendar_year_quarter", "calendar_half_year", "calendar_year", "holiday_indicator", "weekday_indicator", "selling_season"
from "samp__dbt_tmp"
);
Стратегия insert_overwrite
:
Стратегия insert_overwrite
не использует полное сканирование таблицы для удаления записей. Вместо удаления записей она удаляет целые разделы. Эта стратегия может принимать параметры partition_by_string
и partitions
. Вы предоставляете эти параметры, когда хотите перезаписать часть таблицы.
partition_by_string
принимает выражение, на основе которого происходит разбиение таблицы на разделы. Это предложение PARTITION BY в Vertica.
partitions
принимает список значений в столбце раздела.
Параметр конфигурации partitions
должен использоваться с осторожностью. Две ситуации, которые следует учитывать:
- Меньше разделов в параметре
partitions
, чем в условии where: в целевой таблице появляются дубликаты. - Больше разделов в параметре
partitions
, чем в условии where: в целевой таблице отсутствуют строки. Меньше строк в целевой таблице, чем в исходной.
Чтобы узнать больше о предложении PARTITION BY, ознакомьтесь здесь
Параметр partitions
является необязательным, если параметр partitions
не предоставлен, разделы в условии where будут удалены из целевой таблицы и вставлены обратно из исходной. Если вы используете условие where, вам может не понадобиться параметр partitions
.
Условие where также является необязательным, но если оно не предоставлено, то все данные из источника вставляются в целевую таблицу.
Если не предоставлено условие where и параметр partitions
, то все разделы из таблицы удаляются и вставляются снова.
Если параметр partitions
предоставлен, но условие where не предоставлено, в целевой таблице появляются дубликаты, потому что разделы в параметре partitions
удаляются, но все данные из исходной таблицы (без условия where) вставляются в целевую.
Параметр конфигурации partition_by_string
также является необязательным. Если параметр partition_by_string
не предоставлен, то он ведет себя как delete+insert
. Он удаляет все записи из целевой таблицы и затем вставляет все записи из исходной. Он не будет использовать или удалять разделы.
Если оба параметра partition_by_string
и partitions
не предоставлены, то стратегия insert_overwrite
очищает целевую таблицу и вставляет данные из исходной таблицы в целевую.
Если вы хотите использовать параметр partitions
, то вам нужно разбить таблицу на разделы, передав параметр partition_by_string
.
- Исходный код
- Код выполнения
{{config(materialized = 'incremental',incremental_strategy = 'insert_overwrite',partition_by_string='YEAR(cc_open_date)',partitions=['2023'])}}
select * from online_sales.call_center_dimension
select PARTITION_TABLE('online_sales.update_call_center_dimension');
SELECT DROP_PARTITIONS('online_sales.update_call_center_dimension', '2023', '2023');
SELECT PURGE_PARTITION('online_sales.update_call_center_dimension', '2023');
insert into "VMart"."online_sales"."update_call_center_dimension"
("call_center_key", "cc_closed_date", "cc_open_date", "cc_name", "cc_class", "cc_employees",
"cc_hours", "cc_manager", "cc_address", "cc_city", "cc_state", "cc_region")
(
select "call_center_key", "cc_closed_date", "cc_open_date", "cc_name", "cc_class", "cc_employees",
"cc_hours", "cc_manager", "cc_address", "cc_city", "cc_state", "cc_region"
from "update_call_center_dimension__dbt_tmp"
);
Опции оптимизации для материализации таблиц
Существует множество оптимизаций, которые можно использовать при материализации моделей в виде таблиц. Каждый параметр конфигурации применяет специфичное для Vertica пр едложение в сгенерированном DDL CREATE TABLE
.
Для получения дополнительной информации смотрите Vertica опции для оптимизации таблиц.
Вы можете настроить эти оптимизации в своем SQL-файле модели, как описано в примерах ниже:
Конфигурация предложения ORDER BY
Чтобы использовать предложение ORDER BY
в операторе CREATE TABLE
, используйте параметр конфигурации order_by
в вашей модели.
Использование параметра конфигурации order_by
- Исходный код
- Код выполнения
{{ config( materialized='table', order_by='product_key') }}
select * from public.product_dimension
create table "VMart"."public"."order_s__dbt_tmp" as
( select * from public.product_dimension)
order by product_key;
Конфигурация предложения SEGMENTED BY
Ч тобы использовать предложение SEGMENTED BY
в операторе CREATE TABLE
, используйте параметры конфигурации segmented_by_string
или segmented_by_all_nodes
в вашей модели. По умолчанию для сегментации таблиц используется ALL NODES, поэтому предложение ALL NODES в SQL-операторе будет добавлено при использовании параметра конфигурации segmented_by_string
. Вы можете отключить ALL NODES, используя параметр no_segmentation
.
Чтобы узнать больше о предложении segmented by, ознакомьтесь здесь.
Использование параметра конфигурации segmented_by_string
Параметр конфигурации segmented_by_string
может использоваться для сегментации данных проекции с использованием SQL-выражения, такого как хеш-сегментация.
- Исходный код
- Код выполнения
{{ config( materialized='table', segmented_by_string='product_key' ) }}
select * from public.product_dimension
create table
"VMart"."public"."segmented_by__dbt_tmp"
as (select * from public.product_dimension)
segmented by product_key ALL NODES;
Использование параметра конфигурации segmented_by_all_nodes
Параметр конфигурации segmented_by_all_nodes
может использоваться для сегментации данных проекции для распределения по всем узлам кластера.
Если вы хотите передать параметр segmented_by_all_nodes
, то вам нужно сегментировать таблицу, передав параметр segmented_by_string
.
- Исходный код
- Код выполнения
{{ config( materialized='table', segmented_by_string='product_key' ,segmented_by_all_nodes='True' ) }}
select * from public.product_dimension
create table "VMart"."public"."segmented_by__dbt_tmp" as
(select * from public.product_dimension)
segmented by product_key ALL NODES;
Конфигурация предложения UNSEGMENTED ALL NODES
Чтобы использовать предложение UNSEGMENTED ALL NODES
в операторе CREATE TABLE
, используйте параметр конфигурации no_segmentation
в вашей модели.
Использование параметра конфигурации no_segmentation
- Исходный код
- Код выполнения
{{config(materialized='table',no_segmentation='true')}}
select * from public.product_dimension
create table
"VMart"."public"."ww__dbt_tmp"
INCLUDE SCHEMA PRIVILEGES as (
select * from public.product_dimension )
UNSEGMENTED ALL NODES ;
Конфигурация предложения PARTITION BY
Чтобы использовать предложение PARTITION BY
в операторе CREATE TABLE
, используйте параметры конфигурации partition_by_string
, partition_by_active_count
или partition_by_group_by_string
в вашей модели.
Чтобы узнать больше о предложении partition by, ознакомьтесь здесь
Использование параметра конфигурации partition_by_string
partition_by_string
(необязательный) принимает строковое значение любого одного конкретного column_name
, на основе которого происходит разбиение данных таблицы на разделы.
- Исходный код
- Код выполнения
{{ config( materialized='table', partition_by_string='employee_age' )}}
select * FROM public.employee_dimension
create table "VMart"."public"."test_partition__dbt_tmp" as
( select * FROM public.employee_dimension);
alter table "VMart"."public"."test_partition__dbt_tmp"
partition BY employee_age
Использование параметра конфигурации partition_by_active_count
partition_by_active_count
(необязательный) указывает, сколько разделов активно для этой таблицы. Он принимает целочисленное значение.
Если вы хотите передать параметр partition_by_active_count
, то вам нужно разбить таблицу на разделы, передав параметр partition_by_string
.
- Исходный код
- Код выполнения
{{ config( materialized='table',
partition_by_string='employee_age',
partition_by_group_by_string="""
CASE WHEN employee_age < 5 THEN 1
WHEN employee_age>50 THEN 2
ELSE 3 END""",
partition_by_active_count = 2) }}
select * FROM public.employee_dimension
create table "VMart"."public"."test_partition__dbt_tmp" as
( select * FROM public.employee_dimension );
alter table "VMart"."public"."test_partition__dbt_tmp" partition BY employee_ag
group by CASE WHEN employee_age < 5 THEN 1
WHEN employee_age>50 THEN 2
ELSE 3 END
SET ACTIVEPARTITIONCOUNT 2 ;
Использование параметра конфигурации partition_by_group_by_string
Параметр partition_by_group_by_string
(необязательный) принимает строку, в которой пользователь должен указать каждую группу случаев в виде одной строки.
Это значение выводится из значения partition_by_string
.
Параметр partition_by_group_by_string
используется для объединения разделов в отдельные группы разделов.
Если вы хотите передать параметр partition_by_group_by_string
, то вам нужно разбить таблицу на разделы, передав параметр partition_by_string
.
- Исходный код
- Код выполнения
{{config(materialized='table',
partition_by_string='number_of_children',
partition_by_group_by_string="""
CASE WHEN number_of_children <= 2 THEN 'small_family'
ELSE 'big_family' END""")}}
select * from public.customer_dimension
create table "VMart"."public"."test_partition__dbt_tmp" INCLUDE SCHEMA PRIVILEGES as
( select * from public.customer_dimension ) ;
alter table "VMart"."public"."test_partition__dbt_tmp"
partition BY number_of_children
group by CASE WHEN number_of_children <= 2 THEN 'small_family'
ELSE 'big_family' END ;
Конфигурация предложения KSAFE
Чтобы использовать предложение KSAFE
в операторе CREATE TABLE
, используйте параметр конфигурации ksafe
в вашей модели.
- Исходный код
- Код выполнения
{{ config( materialized='table', ksafe='1' ) }}
select * from public.product_dimension
create table "VMart"."public"."segmented_by__dbt_tmp" as
(select * from public.product_dimension )
ksafe 1;