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

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

Конфигурация инкрементальных моделей

Использование параметра конфигурации on_schema_change

Вы можете использовать параметр on_schema_change со значениями ignore, fail и append_new_columns. Значение sync_all_columns в настоящее время не поддерживается.

Конфигурация параметра ignore (по умолчанию)

vertica_incremental.sql
    
{{config(materialized = 'incremental',on_schema_change='ignore')}}

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


Конфигурация параметра fail

vertica_incremental.sql
      {{config(materialized = 'incremental',on_schema_change='fail')}} 


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


Конфигурация параметра append_new_columns

vertica_incremental.sql
    

{{ config( materialized='incremental', on_schema_change='append_new_columns') }}



select * from public.seed_added


Использование параметра конфигурации incremental_strategy

Стратегия append (по умолчанию):

Вставка новых записей без обновления или перезаписи существующих данных. append добавляет только новые записи на основе условия, указанного в условном блоке is_incremental().

vertica_incremental.sql

{{ config( materialized='incremental', incremental_strategy='append' ) }}


select * from public.product_dimension


{% if is_incremental() %}

where product_key > (select max(product_key) from {{this }})


{% endif %}

Стратегия merge:

Сопоставление записей на основе unique_key; обновление старых записей, вставка новых. (Если unique_key не указан, все новые данные вставляются, аналогично append.) Параметр конфигурации unique_key обязателен для использования стратегии merge, значение, принимаемое этим параметром, — это один столбец таблицы.

vertica_incremental.sql

{{ config( materialized = 'incremental', incremental_strategy = 'merge', unique_key='promotion_key' ) }}


select * FROM public.promotion_dimension


Использование параметра конфигурации merge_update_columns

Параметр конфигурации merge_update_columns передается для обновления только указанных столбцов и принимает список столбцов таблицы.

vertica_incremental.sql

{{ config( materialized = 'incremental', incremental_strategy='merge', unique_key = 'id', merge_update_columns = ["names", "salary"] )}}

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

Стратегия delete+insert:

С помощью инкрементальной стратегии delete+insert вы можете указать dbt использовать двухэтапный инкрементальный подход. Сначала он удалит записи, обнаруженные через настроенный блок is_incremental(), а затем повторно вставит их. Параметр unique_key обязателен для использования стратегии delete+insert, который указывает, как обновлять записи при наличии дублированных данных. Значение, принимаемое этим параметром, — это один столбец таблицы.

vertica_incremental.sql

{{ config( materialized = 'incremental', incremental_strategy = 'delete+insert', unique_key='date_key' ) }}


select * FROM public.date_dimension

Стратегия 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.

vertica_incremental.sql
{{config(materialized = 'incremental',incremental_strategy = 'insert_overwrite',partition_by_string='YEAR(cc_open_date)',partitions=['2023'])}}


select * from online_sales.call_center_dimension

Опции оптимизации для материализации таблиц

Существует множество оптимизаций, которые можно использовать при материализации моделей в виде таблиц. Каждый параметр конфигурации применяет специфичное для Vertica предложение в сгенерированном DDL CREATE TABLE.

Для получения дополнительной информации смотрите Vertica опции для оптимизации таблиц.

Вы можете настроить эти оптимизации в своем SQL-файле модели, как описано в примерах ниже:

Конфигурация предложения ORDER BY

Чтобы использовать предложение ORDER BY в операторе CREATE TABLE, используйте параметр конфигурации order_by в вашей модели.

Использование параметра конфигурации order_by

vertica_incremental.sql
        {{ config(  materialized='table',  order_by='product_key') }} 

select * from public.product_dimension


Конфигурация предложения 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-выражения, такого как хеш-сегментация.

vertica_incremental.sql
   
{{ config( materialized='table', segmented_by_string='product_key' ) }}


select * from public.product_dimension

Использование параметра конфигурации segmented_by_all_nodes

Параметр конфигурации segmented_by_all_nodes может использоваться для сегментации данных проекции для распределения по всем узлам кластера.

Примечание:

Если вы хотите передать параметр segmented_by_all_nodes, то вам нужно сегментировать таблицу, передав параметр segmented_by_string.

vertica_incremental.sql
        {{ config( materialized='table', segmented_by_string='product_key' ,segmented_by_all_nodes='True' )  }}  

select * from public.product_dimension


Конфигурация предложения UNSEGMENTED ALL NODES

Чтобы использовать предложение UNSEGMENTED ALL NODES в операторе CREATE TABLE, используйте параметр конфигурации no_segmentation в вашей модели.

Использование параметра конфигурации no_segmentation

vertica_incremental.sql
      
{{config(materialized='table',no_segmentation='true')}}


select * from public.product_dimension

Конфигурация предложения 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, на основе которого происходит разбиение данных таблицы на разделы.

vertica_incremental.sql
      
{{ config( materialized='table', partition_by_string='employee_age' )}}


select * FROM public.employee_dimension

Использование параметра конфигурации partition_by_active_count

partition_by_active_count (необязательный) указывает, сколько разделов активно для этой таблицы. Он принимает целочисленное значение.

Примечание:

Если вы хотите передать параметр partition_by_active_count, то вам нужно разбить таблицу на разделы, передав параметр partition_by_string.

vertica_incremental.sql
    {{ 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


Использование параметра конфигурации 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.

vertica_incremental.sql

{{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

Конфигурация предложения KSAFE

Чтобы использовать предложение KSAFE в операторе CREATE TABLE, используйте параметр конфигурации ksafe в вашей модели.

vertica_incremental.sql
{{  config(  materialized='table',    ksafe='1'   ) }} 

select * from public.product_dimension


0