Рождение звезды (генератора)
Мы все, вероятно, были в такой ситуации: Таблица A содержит 56 столбцов, и мы хотим выбрать все, кроме одного из них (column_56). Итак, начнем...
select
column_1,
column_2,
column_3,
please_save_me…
from {{ ref('table_a') }}
В этот момент вы понимаете, что ваше желание продолжать набирать оставшиеся 52 столбца практически исчезло, и вы, вероятно, начинаете сомневаться в жизненных решениях, которые привели вас сюда.
Но что, если бы был способ сократить эти 56+ строк кода до нескольких? Вот тут-то и приходит на помощь удобный макрос dbt.
Макрос star в dbt
dbt поддерживает dbt_utils, пакет макросов и тестов, который специалисты по данным могут использовать, чтобы писать более код в своем проекте dbt. Один из макросов, предлагаемых dbt utils, — это генератор star.
Этот макрос:
- Генерирует список всех полей, разделенных запятыми, которые существуют в отношении
fromи исключает любые поля, указанные в аргументеexcept, - Может по желанию добавить префикс ко всем сгенерированным полям, используя аргумент
relation_alias, - А также может добавлять префиксы и/или суффиксы ко всем сгенерированным полям, используя аргументы
prefixиsuffix.
Что это значит для приведенного выше примера? Вместо того чтобы прописывать все 55 столбцов, вы можете использовать макрос star, чтобы выбрать все поля, кроме того, которое вам не нужно:
select
{{ dbt_utils.star(from=ref('table_a'), except=['column_56']) }}
from {{ ref('table_a') }}
Эта модель dbt компилируется в:
select
column_1,
column_2,
…, --представьте, что мы не были ленивыми и прописали все остальные столбцы
column_55
from table_a
С помощью макроса star все столбцы, кроме column_56, генерируются в виде списка, разделенного запятыми, в операторе select. То, что раньше было 56+ строками утомительного, монотонного SQL, становится 3 строками с использованием макроса star. Вы также можете исключить несколько столбцов, передав их имена в аргумент except.
Если вы хотите присвоить всем полям в модели один и тот же псевдоним, не переименовывая их явно, вы также можете использовать макрос star с переданным аргументом relation_alias:
select
{{ dbt_utils.star(from=ref('table_a'), relation_alias='my_new_alias') }}
from {{ ref('table_a') }}
Теперь это вернет все поля из table_a с форматом именования my_new_alias.field_name.
Под капотом макрос star на самом деле использует другой макрос dbt utils (get_filtered_columns_in_relation), чтобы перебрать поля для их выбора, присвоения псевдонимов и/или добавления к ним строковых значений.
Почему мы любим макрос star
Это не секрет: команда данных в dbt Labs любит использовать макросы и тесты dbt utils, когда это уместно. Мы настолько любим dbt utils, что создали для них турнир March Madness Utils Bracket (вопросы не принимаются в данный момент) и использовали макрос star более 30 раз в нашем внутреннем репозитории dbt.

В целом, макрос star — отличный способ начать использовать пакет dbt utils, писать DRY код и уменьшить риск развития туннельного синдрома.

Comments