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

Рождение звезды (генератора)

· 3 мин. чтения
Kira Furuichi

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

Loading

Missed Coalesce 2024?

Catch up on Coalesce 2024 and register to access a select number of on-demand sessions.

Register and watch