Рождение звезды (генератора)
Мы все, вероятно, были в такой ситуации: Таблица 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