Вопросы на собеседовании: Analytics Engineer / Инженер аналитики
100 реальных вопросов с образцовыми ответами и пояснениями для уровня Middle.
Смотреть пример резюме: Analytics Engineer / Инженер аналитики →Тренировка флешкарточками
Интервальное повторение · Hunter Pass
Вопросы
Слоистая структура dbt-проекта дает каждой модели одну четкую ответственность и ограничивает связанность сырых источников с потребителями.
- Staging-модели переименовывают, приводят типы и слегка стандартизируют одну исходную таблицу без бизнес-агрегаций.
- Intermediate-модели выражают переиспользуемые соединения или преобразования, которые слишком специализированы для прямой публикации в BI.
- Mart-модели публикуют факты и измерения в стабильном бизнес-гранулярном виде с тестами, документацией и контрактами.
- Потребители должны зависеть от mart-моделей, а не от staging-моделей в форме источника, чтобы изменения исходной схемы оставались локальными.
Зачем это спрашивают: Интервьюер проверяет, умеете ли вы строить поддерживаемый граф зависимостей dbt, а не просто раскладывать SQL по файлам.
Материализацию выбирают по стоимости запроса, частоте пересборки, требуемой задержке для потребителей и необходимости физической таблицы.
- View подходит для легкой логики, которая всегда должна отражать актуальные входные данные, но переносит вычисления на каждый запрос потребителя.
- Table подходит для дорогих преобразований, когда полная пересборка приемлема, а быстрые downstream-чтения важны.
- Incremental ограничивает обработку изменившимися данными, но требует надежной границы изменений и идемпотентной логики обновления.
- Ephemeral встраивает переиспользуемый SQL как CTE, не занимая хранилище, но может порождать крупные скомпилированные запросы.
Зачем это спрашивают: Сильный ответ рассматривает материализацию как решение о стоимости и корректности, а не как неизменное соглашение проекта.
Ephemeral-модель будет плохим выбором, если встраивание скрывает lineage, дублирует дорогие вычисления или создает громоздкий скомпилированный запрос.
- Каждый зависимый узел получает SQL ephemeral-модели как CTE, поэтому общая дорогая логика может вычисляться многократно.
- Глубокие цепочки могут превысить ограничения сложности запросов в хранилище и затруднить чтение планов выполнения.
- Ephemeral-модель нельзя запросить напрямую для проверки или передать инструменту, которому нужна физическая таблица.
- View или table предпочтительнее, когда переиспользование, наблюдаемость или независимый доступ важнее экономии хранилища.
Зачем это спрашивают: Интервьюер хочет увидеть понимание последствий компиляции dbt, а не только отсутствия сохраненной таблицы.
Jinja рендерит SQL и строит граф до того, как получившийся запрос выполняется в хранилище.
- Функции ref, source, var и config разрешаются во время компиляции модели в dbt.
- Вызову run_query нужно активное соединение с хранилищем, поэтому его следует ограждать execute для безопасного парсинга.
- SQL-выражения в отрендеренном результате вычисляет хранилище, а не Jinja.
- Смешение этих фаз может породить зависящие от окружения манифесты или макросы, падающие в командах только с парсингом.
Зачем это спрашивают: Вопрос проверяет, умеет ли кандидат точно рассуждать о фазах парсинга, компиляции и выполнения dbt.
Хороший dbt-макрос централизует устойчивый шаблон преобразования, сохраняя явными входы, выходной SQL и побочные эффекты.
- Он должен устранять существенное дублирование, а не скрывать короткое выражение, которое понятнее написать напрямую.
- Параметры должны отражать различия бизнеса или адаптеров без приема произвольных фрагментов, которые трудно проверять.
- Скомпилированный SQL должен оставаться читаемым, поскольку ревьюеры и оптимизаторы хранилища работают с итоговым запросом.
- Поведение макроса следует покрывать репрезентативными моделями или unit-тестами и документировать, если его контракт неочевиден.
Зачем это спрашивают: Интервьюер оценивает зрелость абстракций и способность сохранить поддерживаемость, а не только сократить повторение текста.
Adapter dispatch выбирает специфичную для хранилища реализацию макроса за единым общим интерфейсом.
- Вызывающий код использует общее имя макроса, а dbt ищет реализацию в настроенных пространствах имен и текущем адаптере.
- Реализация по умолчанию может содержать переносимый SQL, а варианты BigQuery или Snowflake нужны только при различиях синтаксиса или поведения.
- Dispatch убирает условные проверки адаптера из бизнес-моделей и позволяет проектам осознанно переопределять поведение пакета.
- Переносимость все равно требует тестов на каждом поддерживаемом адаптере, поскольку эквивалентный синтаксис может различаться типами или семантикой null.
Зачем это спрашивают: Сильный ответ объясняет и механизм dispatch, и ограничения заявления о переносимости между хранилищами.
К пакету dbt следует относиться как к версионируемому production-коду с узкой и проверенной причиной внедрения.
- Нужно оценить, решают ли его макросы повторяющиеся задачи, эффективно ли компилируются на целевом адаптере и имеют ли стабильные интерфейсы.
- Совместимые версии следует фиксировать в зависимостях и читать release notes перед обновлением, чтобы избежать неожиданных изменений SQL.
- Обновления пакета нужно проверять в CI на репрезентативных моделях и просматривать скомпилированный SQL важных макросов.
- Локальный код проекта предпочтительнее, если зависимость велика, плохо поддерживается или нужна ради одного простого преобразования.
Зачем это спрашивают: Интервьюер проверяет, умеет ли кандидат балансировать переиспользование с рисками зависимости, совместимости и сопровождения.
dbt seeds подходят для небольших, редко меняющихся справочных наборов данных, которым место в системе контроля версий.
- Хорошие примеры включают маппинг стран, управляемые списки категорий и тестовые фикстуры, ревьюимые вместе с проектом.
- Типы столбцов следует задавать явно, если вывод хранилища может изменить коды, даты или ведущие нули.
- Крупные, чувствительные, часто обновляемые или внешне управляемые данные должны поступать через ingestion-процесс, а не CSV-коммит.
- Seed все равно требует владельца, тестов и процесса изменений, поскольку downstream-модели могут считать его контрактом.
Зачем это спрашивают: Вопрос проверяет, отличает ли кандидат управляемые справочные данные от удобного, но неподходящего обходного способа загрузки.
Стратегия timestamp обнаруживает изменения по надежному столбцу updated_at, а check сравнивает выбранные столбцы источника.
- Timestamp проще и хорошо масштабируется, если каждое значимое изменение продвигает достоверную временную метку источника.
- Check полезна без такой метки, но требует осознанного выбора check_cols и большего объема сравнений.
- Включение изменчивых или незначимых столбцов в check_cols создает ненужные исторические версии.
- Ни одна стратегия не безопасна, если исправления источника приходят без изменения временной метки или сравниваемых значений.
Зачем это спрашивают: Интервьюер оценивает, умеете ли вы выбирать способ обнаружения изменений snapshots по гарантиям источника, а не по предпочтению.
dbt snapshot хранит интервалы версий через dbt_valid_from и dbt_valid_to с настраиваемой обработкой удаленных исходных строк.
- Новая обнаруженная версия закрывает предыдущий интервал и вставляет текущее состояние для того же уникального ключа.
- Уникальный ключ должен стабильно определять одну логическую сущность, иначе история ошибочно разделится или перезапишется.
- Физические удаления можно игнорировать, инвалидировать или представлять новыми записями в зависимости от конфигурации snapshot и версии dbt.
- Downstream-соединения должны сопоставлять время события с интервалом действия, если нужна историческая атрибуция.
Зачем это спрашивают: Сильный ответ связывает метаданные snapshot с корректными временными соединениями и явной семантикой удалений.
Incremental-модель идемпотентна, если повторная обработка одного входного окна дает те же целевые строки без дублей и дрейфа.
- Ее unique_key должен совпадать с гранулярностью результата, а выбранная стратегия должна обновлять или заменять строки на этом уровне.
- Инкрементальный предикат должен включать все способные измениться записи, обычно с ограниченным перекрытием для опоздавших данных.
- Преобразования не должны зависеть от времени запуска, если эти значения не стабильны или не сохраняются намеренно.
- Повторная обработка перекрытия должна быть безопасной, поэтому слепой append обычно не подходит для изменяемых событий.
Зачем это спрашивают: Интервьюер проверяет, воспринимает ли кандидат инкрементальность как контракт корректности, а не только оптимизацию производительности.
Incremental-стратегии различаются областью целевой таблицы, которую они переписывают, и требованиями к ключам или партициям.
- Append только вставляет выбранные строки, поэтому дешевле всего для неизменяемых данных и небезопасен при обновлениях или повторной обработке.
- Merge обновляет совпавшие уникальные ключи и вставляет новые, а delete plus insert заменяет совпавшие ключи с более широкой поддержкой адаптеров.
- Insert overwrite заменяет целые партиции и хорошо работает, когда партиции служат надежными единицами пересчета.
- Microbatch делит временной диапазон на ограниченные пакеты, улучшая возобновляемость и параллелизм для очень крупных событийных наборов.
Зачем это спрашивают: Сильный ответ выбирает стратегию по характеру изменений, поддержке хранилища и границе пересчета.
Incremental-модель должна повторно обрабатывать осознанно выбранное перекрытие или получать изменения из надежного сигнала обновления, а не фильтровать только по последнему времени события.
- Окно lookback захватывает задержанные события, но его длина должна отражать измеренное опоздание и допустимую стоимость.
- updated_at или последовательность CDC точнее выделяют изменения, если источник гарантирует полноту.
- Merge или замена партиций должны согласовывать повторно обработанные строки на гранулярности модели, чтобы не создавать дубли.
- Периодическая полная сверка может ограничить остаточный дрейф за пределами выбранного окна изменений.
Зачем это спрашивают: Интервьюер оценивает, как кандидат балансирует свежесть, корректность и стоимость хранилища для изменяемых данных.
on_schema_change определяет, как dbt согласует выбранные столбцы модели с существующей incremental-таблицей, но не выполняет backfill значений.
- ignore оставляет целевую схему без изменений, а fail останавливает запуск при обнаружении различия.
- append_new_columns добавляет новые выбранные столбцы, не удаляя старые.
- sync_all_columns синхронизирует добавления, удаления и поддерживаемые изменения типов, но может быть дорогим в некоторых хранилищах.
- В существующих строках новые столбцы могут остаться пустыми или старыми, поэтому full refresh или явный backfill остается отдельным решением.
Зачем это спрашивают: Сильный ответ отличает согласование схемы от пересчета исторических данных.
Full refresh оправдан, когда корректность целевой таблицы уже нельзя восстановить обработкой ограниченного набора изменений.
- Примеры включают изменение исторической бизнес-логики, исправленную историю источника или новый столбец, требующий значений для всех прошлых строк.
- Перед пересборкой крупной таблицы команда должна оценить время, стоимость хранилища, блокировки и доступность для downstream-потребителей.
- Пересчет отдельных партиций предпочтительнее, если он восстанавливает корректность без замены всей таблицы.
- Защита от full refresh предотвращает случайные пересборки, а документированная процедура делает намеренный запуск воспроизводимым.
Зачем это спрашивают: Интервьюер проверяет, отличает ли кандидат необходимую для корректности пересборку от повседневного использования дорогого обходного пути.
Контракт модели dbt при построении проверяет объявленные имена выходных столбцов и поддерживаемые типы данных.
- Он дает downstream-потребителям явный структурный интерфейс и заставляет несовместимые изменения схемы завершаться ошибкой заранее.
- Ограничения можно объявить, но фактическое принудительное применение зависит от хранилища и типа ограничения.
- Контракты не доказывают семантическую корректность, свежесть, уникальность или допустимые значения без дополнительных тестов и SLA.
- Версионированные модели подходят, когда намеренно несовместимый интерфейс должен временно сосуществовать с текущим для миграции потребителей.
Зачем это спрашивают: Интервьюер оценивает, понимает ли кандидат и ценность, и границы контрактов схемы.
Полезный dbt exposure описывает реальный downstream-артефакт, его зависимости, владельца, тип и бизнес-критичность.
- depends_on должен ссылаться на модели или метрики, действительно питающие дашборд, ноутбук, приложение или reverse-ETL-синхронизацию.
- Владелец и maturity делают lineage применимым, показывая, кто согласует изменения и насколько тщательно нужно защищать артефакт.
- Ссылки на статус или URL связывают сгенерированную документацию с потребителем и его поверхностью мониторинга.
- Покрытие exposures приносит пользу, когда CI использует lineage для определения затронутых потребителей, а не когда записи остаются декоративными.
Зачем это спрашивают: Сильный ответ рассматривает exposures как исполнимые downstream-контракты, а не пассивную документацию.
Пороги source freshness должны исходить из времени, к которому потребителю нужны надежные данные, и ожидаемой частоты загрузки источника.
- warn_after может обозначать раннее ухудшение, а error_after представляет нарушенное обязательство и должен проваливать соответствующую проверку.
- loaded_at_field должен отражать доступность после загрузки, а не несвязанное время бизнес-события.
- Пороги должны учитывать частоту источника, часовой пояс, выходные и известные окна доставки вместо одного глобального значения.
- Exposures связывают каждое правило freshness с дашбордами, анализами Hex или reverse-ETL-аудиториями, чьи SLA от него зависят.
Зачем это спрашивают: Интервьюер проверяет, умеет ли кандидат превращать конфигурацию freshness в dbt в обязательство надежности перед потребителем.
Slim CI сравнивает текущий проект с предыдущим манифестом, строит измененные узлы и выбранных потомков, а неизмененные ссылки направляет в существующее окружение.
- State-селекторы вроде state:modified находят изменения графа или конфигурации, записанные в артефактах.
- Оператор plus может включить downstream-потомков, чье поведение способно измениться из-за измененного предка.
- defer разрешает ref для непостроенных моделей через стабильное окружение сравнения, избегая полной пересборки хранилища в CI.
- CI должен использовать совместимые манифесты и учитывать макросы, seeds, переменные и косвенный выбор тестов, способные расширить область влияния.
Зачем это спрашивают: Сильный ответ объясняет, как артефакты и lineage сокращают работу CI без ослабления покрытия изменений.
dbt Core предоставляет CLI-фреймворк преобразований, а dbt Cloud добавляет управляемый control plane для разработки, расписаний, метаданных и контролируемого выполнения.
- Core дает гибкость развертывания, но оставляет команде оркестрацию, учетные данные, хранение артефактов и среду разработки.
- Cloud предоставляет управляемые jobs, IDE, контроль окружений, логи и платформенные функции, доступность которых зависит от тарифа.
- Оба запускают dbt-проекты в хранилище, поэтому дизайн моделей и производительность SQL остаются ответственностью команды.
- Выбор должен учитывать governance, интеграции, стоимость и операционный ownership, а не предположение, что один вариант меняет семантику dbt.
Зачем это спрашивают: Интервьюер оценивает практическое понимание платформ без сведения сравнения только к облачному или локальному запуску.
Закрытые вопросы
- 21
Почему гранулярность таблицы фактов нужно объявлять до выбора измерений и мер?
modeling - 22
Когда измерение должно использовать SCD Type 1?
- 23
Как SCD Type 2 сохраняет историю и что делает его реализацию корректной?
- 24
Когда SCD Type 3 полезен по сравнению с Type 1 или Type 2?
- 25
Когда связь многие ко многим требует bridge table в dimensional modeling?
- 26
Что такое factless fact table и когда она предпочтительнее флагов в измерении?
modeling - 27
Чем различаются таблицы фактов periodic snapshot и accumulating snapshot?
modelingsnapshot - 28
Что такое conformed dimensions и role-playing dimensions и почему они важны?
- 29
Какие обязанности относятся к semantic layer, а не к отдельным дашбордам?
semantic-layer - 30
Как аддитивность метрик должна влиять на дизайн semantic layer?
designmonitoring - 31
Как semantic models, entities и metrics работают вместе в MetricFlow?
monitoring - 32
Как проектировать pre-aggregations в Cube для производительности без потери семантической корректности?
aggregationdesignperformance - 33
Как сохранить согласованность одной управляемой метрики между Looker и Hex?
monitoringbi - 34
Какой контракт должен существовать между аналитической моделью и reverse-ETL-синхронизацией?
etl - 35
Как DAG в Airflow для dbt-нагрузок должен определять границы задач?
dbtairflow - 36
Когда Airflow должен использовать расписания по времени, sensors или dataset-aware scheduling?
jobsairflow - 37
Чем модель assets в Dagster отличается от оркестрации, ориентированной на задачи?
orchestration - 38
Что делает retries и backfills безопасными в аналитическом workflow оркестрации?
orchestrationbackfill - 39
Как материализация и инкрементальность обменивают хранилище на вычисления в облачном warehouse?
warehouse - 40
Как выбирать партиционирование и кластеризацию для крупной таблицы BigQuery?
partitioningbigqueryclustering - 41
Какие решения в запросах и моделях снижают стоимость BigQuery в масштабе?
queriesbigquerydesign - 42
Как взаимодействуют pruning микропартиций и clustering keys в Snowflake?
partitioningsnowflakeclustering - 43
Как выбирать размер и масштабирование virtual warehouses Snowflake для аналитических нагрузок?
warehousesnowflakescaling - 44
Как следует сочетать generic-, singular- и unit-тесты в dbt?
unitgenericsdbt - 45
Когда Great Expectations дает ценность сверх dbt tests?
dbtdata-qualitytesting - 46
Что Elementary добавляет в стек качества данных на основе dbt?
qualitydbt - 47
Какие измерения качества данных должна измерять аналитическая платформа?
quality - 48
Что аналитический CI/CD pipeline должен проверять перед merge изменения dbt?
ci-cddbtvalidation - 49
Как окружения и артефакты dbt должны поддерживать продвижение из CI в production?
dbtartifacts - 50
Как выбирать severity и пороги для проверок качества данных и freshness SLA?
qualityseverity-priority - 51
Как смоделировать monthly recurring revenue из событий lifecycle подписки?
- 52
Как смоделировать orders, payments, refunds и chargebacks без дублирования revenue?
- 53
Как присоединить facts к slowly changing customer dimension на дату события?
joinsscd - 54
Как определить revenue metric в Cube или dbt semantic layer для использования разными BI tools?
monitoringdbtsemantic-layer - 55
Как построить переиспользуемую identity map, если users представлены device, account и CRM identifiers?
- 56
Source предоставляет current account state и неполный event log. Как моделировать историю?
- 57
Два dbt-домена используют одну customer model, но имеют разные release schedules. Как установить contract?
dbt - 58
Как моделировать revenue в нескольких currencies?
- 59
Как построить daily inventory snapshot из событий движения stock?
snapshot - 60
Как подготовить customer audience model для reverse ETL через Hightouch или Census?
etl - 61
Join orders, items и promotions завышает gross merchandise value. Как его отладить?
joins - 62
Incremental dbt model внезапно создаёт duplicate customer records. Как найти причину?
dbt - 63
Rows исчезают между Airbyte source и dbt mart. Как их проследить?
dbt - 64
Upstream API меняет nested field с object на array. Как обновить pipeline?
ci-cdapi - 65
Facts приходят раньше dimension records, и relationships tests падают. Как моделировать late-arriving dimensions?
testing - 66
Fivetran history tables показывают больше records, чем source application. Как сверить counts?
- 67
Критичный dbt test падает во время production job. Как провести triage data-quality incident?
incidentsdbt - 68
Looker и Hex notebook расходятся в active customers. Как разрешить расхождение?
conflictbi - 69
В destination reverse-ETL audience на 20 процентов меньше users, чем в dbt. Как это отладить?
etldbt - 70
Daily metrics сдвигаются на один день для некоторых regions. Как отладить timezone?
monitoring - 71
dbt model в BigQuery сканирует несколько терабайт ради одного дня данных. Как её оптимизировать?
bigqueryoptimizationdbt - 72
Snowflake query делает spill в remote storage и работает медленно. Как её настроить?
queriessnowflake - 73
Warehouse join медленный, потому что оба inputs очень крупные. Как снизить стоимость?
joinswarehouse - 74
dbt model является ephemeral и встраивается во множество дорогих downstream queries. Что изменить?
queriesdbt - 75
dbt job занимает два часа, хотя большинство models малы. Как найти critical path?
schedulingcommunicationdbt - 76
Incremental model пропускает updates, приходящие на несколько дней позже. Как это исправить?
- 77
Как передавать source deletions через incremental dbt model?
dbt - 78
Schema change требует перестроить крупную incremental table. Как избежать небезопасного full refresh?
schema - 79
Как выполнить backfill событий за два года, не нарушив daily warehouse workloads?
warehousebackfill - 80
dbt snapshot быстро растёт и содержит частые false changes. Как его исправить?
snapshotdbt - 81
Как спроектировать dbt CI, чтобы pull request тестировал changed models без перестройки warehouse?
code-reviewdesigntesting - 82
Upstream team хочет переименовать column, используемый многими dbt models. Как управлять изменением?
schemadbt - 83
Source freshness SLA нарушен, но dbt transformations успешны. Что делать?
dbt - 84
Elementary сообщает о необычном падении daily rows. Как понять, является ли это реальным incident?
incidents - 85
Как внедрить строгие data tests в legacy mart со множеством существующих failures?
testing - 86
dbt deployment неожиданно меняет executive revenue. Как выполнить rollback и recovery?
deploymentdbt - 87
Вы владеете Airbyte или Fivetran connector, который регулярно не укладывается в sync window. Как повысить reliability?
- 88
Как настроить dbt Cloud environments для development, CI и production?
configdbt - 89
Cube dashboard выполняет дорогие повторяющиеся queries. Как улучшить performance semantic layer?
queriesperformance - 90
Looker dashboard медленный, хотя каждый tile кажется простым. Как провести исследование?
bi - 91
Warehouse spend удвоился после добавления нескольких dbt jobs. Как найти и контролировать cost?
warehousedbt - 92
Как выбрать partitioning и clustering для крупного event mart?
clusteringpartitioning - 93
Finance сообщает другой monthly revenue total, чем analytics mart. Как выполнить reconciliation?
- 94
Бизнес меняет определение active account. Как обновить metric без путаницы в historical reports?
monitoring - 95
Source outage оставил шесть часов пропусков в event table. Как восстановить downstream models?
- 96
Marketing запрашивает sensitive customer attributes в reverse-ETL sync. Как вы ответите?
etl - 97
Analyst строит ценную metric в Hex. Как перевести её в production?
monitoring - 98
Как мигрировать dbt project с BigQuery на Snowflake без изменения результатов metrics?
snowflakebigquerymonitoring - 99
Product team добавляет новую версию event с другими properties. Как развивать analytics model?
- 100
Stakeholder нужна срочная metric завтра, но один source неполный. Как ответственно её предоставить?
stakeholder-managementcommunicationmonitoring