Раздел 26 · Data Engineering

Seeds: статичные данные из CSV

junior~15 мин

без входаВойди, чтобы отмечать прогресс, вести заметки и решать задачи в редакторе. войти

Отто хочет видеть на дашборде не только долю опозданий по зонам, но и норматив: в Центре допустимо 20%, в новом Академическом 35%. Ни в одной системе «Гонца» нормативов нет. Они живут в табличке у Отто на компьютере и меняются раз в квартал на планёрке. Тащить ради двенадцати строк отдельную загрузку в Airflow странно, а вписывать числа прямо в SQL модели неудобно: их будет править Отто, а не ты.

Расписание на двери

На двери кабинета врача висит листок с часами приёма. Его не хранят в больничной базе: он короткий, меняется редко, а поменять его может любой, кто работает в кабинете. При этом все пациенты смотрят на один и тот же листок.

Сид в dbt это такой листок: маленькая таблица в файле CSV прямо в репозитории проекта.

Сид это CSV, который dbt загружает в базу

Сид это CSV-файл в папке seeds/. Первая строка это имена колонок, дальше данные:

zone_id,target_late_pct
1,20
2,25
...
7,35
12,35

Команда dbt seed загружает каждый такой файл в базу таблицей с именем файла: seeds/zone_targets.csv становится dbt_dev.zone_targets. Схема берётся из профиля, как у моделей.

Из моделей на сид ссылаются через ref(), как на любую модель:

-- models/marts/dim_zones.sql
select
    z.zone_id,
    z.zone_name,
    z.opened_on,
    t.target_late_pct
from {{ ref('stg_zones') }} as z
left join {{ ref('zone_targets') }} as t on t.zone_id = z.zone_id

Раз есть ref(), сид попадает в граф. dbt build загрузит его раньше dim_zones, а dbt ls -s zone_targets+ покажет всех, кто от него зависит.

Типы колонок

В CSV нет типов, только текст. dbt угадывает их сам по значениям: целые числа становятся integer, дробные double precision, true и false становятся boolean, даты вида 2026-04-15 типом date, остальное text. Пустая ячейка превращается в null.

Угадывание иногда ошибается. Код зоны 007 станет числом 7, а номер телефона потеряет плюс. Тогда тип задают явно в dbt_project.yml:

seeds:
  gonets:
    zone_targets:
      +column_types:
        target_late_pct: numeric(4,1)

урок из курса

Урок из курса «Data Engineering». Курс покупается один раз и остаётся навсегда: 500 ₽.

Оплата пока не подключена: премиум и курсы открываются промокодом.