О флаге --sample
Флаг --sample в настоящее время недоступен для Python-моделей. Если этот флаг используется с Python-моделью, он будет проигнорирован.
Seeds создаются как обычно, но при обращении к ним из downstream-узлов они будут семплироваться.
Большие наборы данных могут значительно увеличивать время сборки и снижать скорость, с которой разработчики dbt могут разрабатывать и тестировать новый код. Флаг dbt --sample помогает сократить время сборки и затраты на хранилище данных за счёт запуска dbt в режиме выборки (sample mode). Режим выборки позволяет обрабатывать сценарии, в которых нет необходимости строить модель целиком в процессе разработки или CI, но при этом важно включить достаточный объём данных для валидации результатов.
Режим выборки развивает идею проверки семантических результатов, предоставляемую флагом --empty, добавляя выборку данных из модели (или моделей) в вашей development-схеме. Он не покрывает абсолютно все сценарии — например, в некоторых случаях не все join’ы будут заполнены. Тем не менее, это жизнеспособное решение для более быстрой сборки, тестирования и валидации многих стратегий.
Со временем флаг --sample станет более функциональным, но на данный момент он поддерживает только выборку на основе времени.
Использование флага --sample
Флаг --sample доступен для команд run и build. При его использовании режим выборки генерирует отфильтрованные ref и source. Поскольку используется выборка на основе времени, если у вас есть ref, например {{ ref('some_model') }}, который должен семплироваться, необходимо задать event_time для some_model — поле, которое будет использоваться как временная метка.
Для режима выборки поддерживаются два типа спецификаций на основе времени:
- Относительные спецификации времени (relative time specs): фильтруют данные выборки от момента запуска команды назад на заданное целое значение и гранулярность. Поддерживаемые гранулярности:
- часы
- дни
- месяцы
- годы
- Статические спецификации времени (static time specs): фильтруют данные между заданными начальным и конечным периодами с использованием даты и/или timestamp.
Примеры
Предположим, вы хотите запустить модель stg_customers и построить таблицу в вашей development-схеме, используя относительную выборку размером три дня. Команда в IDE будет выглядеть примерно так:
dbt run --select path/to/stg_customers --sample="3 days"
Если у вас есть ещё более крупная модель, например stg_orders, вы можете задать режим выборки в часах:
dbt run --select path/to/stg_customers --sample="6 hours"
Теперь предположим, что вы хотите провалидировать данные по всему бизнесу, используя выборку за более ранний период — вашу самую загруженную неделю в июле, с первого числа до момента закрытия восьмого. В этом случае можно выполнить следующую команду:
dbt run --sample="{'start': '2024-07-01', 'end': '2024-07-08 18:00:00'}"
Чтобы предотвратить семплирование ref, добавьте к нему .render():
with
source as (
select * from {{ ref('stg_customers').render() }}
),
...
После этого dbt выполнит SQL модели в целевом хранилище данных и построит таблицы с данными из указанных размеров выборки.