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()и тестируют как модель. - Подходит для статичных справочников, не для больших или транзакционных данных.