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

Маленькие справочники, которые удобнее держать в репозитории, а не в источнике, — это seeds.

Seed — небольшой CSV-файл в проекте dbt, который команда dbt seed загружает в хранилище как таблицу; данные при этом версионируются в git.

Когда нужны seeds

Не все данные приходят из источников. Бывают маленькие статичные справочники: маппинг кодов стран в названия, список «внутренних» email-доменов для исключения, плановые показатели по месяцам. Заводить ради них пайплайн загрузки — перебор. Положить в CSV рядом с кодом — в самый раз: справочник версионируется, виден в ревью, и любой может его поправить.

Как устроен seed

CSV кладут в папку seeds/. Имя файла станет именем таблицы.

# seeds/country_codes.csv
code,country_name
RU,Россия
KZ,Казахстан
BY,Беларусь
# Загрузить все seeds в хранилище
dbt seed

dbt создаст таблицу country_codes со столбцами code и country_name. Дальше на неё ссылаются как на обычную модель — через ref():

select
    o.order_id,
    cc.country_name
from {{ ref('stg_orders') }} as o
join {{ ref('country_codes') }} as cc
  on o.country_code = cc.code

Типы колонок seed

По умолчанию dbt угадывает типы из CSV. Когда нужно явно задать (например, чтобы код не превратился в число с потерей ведущих нулей), это указывают в YAML:

seeds:
  - name: country_codes
    config:
      column_types:
        code: varchar(2)

Где seed уместен, а где нет

Подходит для seedНЕ для seed
Справочник стран, валютТаблица заказов (это источник)
Маппинги, словари кодовБольшие или часто меняющиеся данные
Плановые/целевые показателиЛюбые транзакционные данные

Как работает под капотом

dbt seed читает CSV, выводит или применяет типы колонок и выполняет в хранилище create table + серию insert (или массовую загрузку). После этого seed — полноправный узел DAG: на него ссылаются через ref(), его можно тестировать и документировать, как любую модель. Ключевая ценность — данные лежат в git, значит любое изменение справочника проходит ревью и имеет историю.

Частые ошибки

  • Грузить большие данные через seed. Seeds — для маленьких статичных справочников, не для тысяч строк и не для транзакций.
  • Полагаться на авто-типы для кодов. Код вроде 01 может стать числом 1; задавайте column_types.
  • Путать seed и source. Seed загружает dbt из CSV; source — это сырьё, загруженное извне.

Итоги

  • Seed — маленький CSV в проекте, который dbt seed грузит в хранилище как таблицу.
  • Данные версионируются в git; на seed ссылаются через ref() и тестируют как модель.
  • Подходит для статичных справочников, не для больших или транзакционных данных.
Проверьте себя
1. Для каких данных предназначены seeds в dbt?
AДля больших транзакционных таблиц
BДля маленьких статичных справочников в CSV (коды стран, маппинги)
CДля логов в реальном времени
DДля сырья из источников
2. Как ссылаются на загруженный seed из модели?
AЧерез source()
BЧерез ref(), как на обычную модель
CЧерез прямое имя таблицы
DЧерез env_var()