awesome-everything EN
↑ Обратно к восхождению

Data engineering

ELT vs ETL: чтение моделей и конфигов

Суть Читай реальные конфиги dbt-моделей и сигнатуру счёта Snowflake, предсказывай поведение пайплайна — идемпотентность, инкрементальную загрузку, backfill — и выбирай фикс наибольшего рычага.
Высота — путь к senior
НольJuniorMiddleSenior
Ты на senior-высоте — в орбите
◷ 14 min

Баги пайплайна живут в конфиге модели и в SQL, а не на диаграмме. Прочитай каждую dbt-модель и трейс, предскажи, что она делает на втором и третьем запуске по расписанию, и выбери фикс, к которому сеньор тянется первым.

Цель

Отработай цикл, который ты гоняешь на каждом ревью пайплайна: прочитай конфиг материализации и инкрементальный фильтр, предскажи, дублирует ли повтор, пересканирует или чисто делает upsert, и тянись к фиксу наибольшего рычага.

Сниппет 1 — тихий аппенд

-- models/marts/fct_events.sql
{{ config(materialized='incremental') }}

select
  event_id,
  user_id,
  event_time,
  amount
from {{ ref('stg_events') }}
Викторина

Модель материализована как 'incremental', но без unique_key и без блока is_incremental(). Что происходит на каждом запуске по расписанию после первого и каков фикс?

Сниппет 2 — идемпотентный merge

-- models/marts/fct_orders.sql
{{ config(
    materialized='incremental',
    incremental_strategy='merge',
    unique_key='order_id'
) }}

select order_id, customer_id, status, updated_at, total
from {{ ref('stg_orders') }}
{% if is_incremental() %}
  where updated_at > (select max(updated_at) from {{ this }})
{% endif %}
Викторина

Статус заказа меняется с 'pending' на 'shipped' (тот же order_id, более новый updated_at). Затем EL-инструмент падает посреди запуска, и оркестратор повторяет весь батч. Какое финальное состояние fct_orders?

Сниппет 3 — счёт за full-refresh

# История запросов Snowflake (одна модель, расписание ежечасно)
fct_pageviews   MEDIUM_WH   bytes_scanned=2.1 TB   elapsed=11m   24 runs/day
{{ config(materialized='table') }}   -- не incremental
select * from {{ ref('stg_pageviews') }}   -- 2 ТБ, непартиционированная, ежечасно
Викторина

Эта одна модель сканирует 2.1 ТБ двадцать четыре раза в день. Каков корневой драйвер стоимости и каков фикс наибольшего рычага — не самый соблазнительный?

Сниппет 4 — backfill

-- Нужен backfill на 90 дней после фикса бага трансформации.
-- Модель использует microbatch:
{{ config(
    materialized='incremental',
    incremental_strategy='microbatch',
    event_time='event_time',
    batch_size='day',
    begin='2024-01-01'
) }}
dbt run --select fct_events --event-time-start "2024-01-01" --event-time-end "2024-04-01"
Викторина

Почему microbatch-модель — правильный инструмент для этого 90-дневного backfill по сравнению с одним full-refresh по тому же диапазону?

Итог

Каждое ревью пайплайна читает конфиг и фильтр: инкрементальная модель без unique_key и без is_incremental() тихо аппендит и пересканирует всё; merge по unique_key делает повтор идемпотентным (upsert, не дубль); полный SELECT * по таблице, сканируемый ежечасно, — это баг стоимости, чинимый инкрементальностью, а не бо́льшим warehouse; а microbatch превращает долгий backfill в независимые, перезапускаемые, идемпотентные дневные единицы. Сначала читай материализацию, потом фильтр, потом решай.

Продолжить восхождение ↑ELT vs ETL: собери реплейабельный, идемпотентный пайплайн
хоткеи развернуть
поиск
K
пред. пьеса
k
след. пьеса
j
тиры
t
это меню
?
sources2
expand
  1. 01
  2. 02

Trademarks belong to their respective owners. Editorial reference only.