Вопросы на собеседовании: Analytics Engineer / Инженер аналитики
100 реальных вопросов с образцовыми ответами и пояснениями для уровня Senior.
Смотреть пример резюме: Analytics Engineer / Инженер аналитики →Тренировка флешкарточками
Интервальное повторение · Hunter Pass
Вопросы
Сначала я сделал бы модель с учетом партиций и только потом оптимизировал SQL-выражения.
- Разбил бы таблицу на партиции по event_date и кластеризовал по tenant_id и event_type, чтобы обычные запросы отсекали большую часть таблицы объемом 4 ПБ.
- Использовал бы event_id как unique_key и merge в BigQuery с просмотром исходных данных за последние 72 часа для поздних событий.
- Добавил бы incremental predicate, который ограничивает сопоставление в целевой таблице теми же тремя партициями по датам, а не сканирует всю историю.
- Проверял бы уникальность event_id в каждой обработанной партиции и сравнивал дневное число строк с сырой таблицей перед публикацией.
Зачем это спрашивают: Такой дизайн ограничивает сканирование источника и целевой таблицы, сохраняя исправления для недавно поступивших событий.
Я определил бы ключ из бизнес-гранулярности, а не из записи о доставке Kafka.
- Задал бы unique_key как составной ключ из source_system и order_id, потому что order_id уникален только внутри одного источника.
- Удалял бы дубли во входной порции через row_number по этому ключу с сортировкой по updated_at и смещению Kafka по убыванию.
- Отклонял бы или помещал в карантин строки с null в компонентах ключа, потому что merge в Snowflake не сможет надежно сопоставить такие значения как один бизнес-ключ.
- Через merge записывал бы строку-победителя и после каждого запуска проверял уникальность составного ключа в данных за 14-дневное окно.
Зачем это спрашивают: Стабильный бизнес-ключ и детерминированное удаление дублей сводят повторные доставки Kafka к одной строке заказа.
Я выбрал бы insert_overwrite, потому что источник является эталоном на уровне целой партиции.
- Построил бы во временном отношении только две исправленные партиции event_date и атомарно заменил бы их.
- Настроил бы стратегию BigQuery insert_overwrite в dbt с явным списком партиций, когда даты запуска известны.
- Оставил бы merge для точечных исправлений отдельных строк, когда перезапись 1,2 ТБ дороже сопоставления небольшого набора изменений.
- Проверил бы число строк и итоговую выручку для обеих дат до передачи замены нижележащим моделям.
Зачем это спрашивают: Замена двух полных партиций исключает дорогое сопоставление ключей и точно повторяет контракт исправлений источника.
Я оставил бы почасовой путь коротким, а длинный хвост обрабатывал бы отдельно по ограниченному расписанию.
- При каждом почасовом запуске перечитывал бы 72 часа, что покрывает измеренное 48-часовое окно с запасом в один день.
- Выполнял бы merge по click_id, чтобы повторное чтение тех же трех дней обновляло существующие клики, а не создавало дубли.
- Раз в неделю запускал бы ограниченный бэкфилл за 10 дней для хвоста в 0,3%, с фильтром по event_date и разбивкой на дневные пакеты.
- Еженедельно отслеживал бы перцентили задержки и расширял 72-часовое окно только тогда, когда 99,7-й перцентиль выйдет за его границу.
Зачем это спрашивают: Разделение основного окна поступления и редкого длинного хвоста защищает почасовой SLA и не теряет поздние клики.
Я сделал бы так, чтобы повторная обработка приводила к тому же состоянию целевой таблицы, а не пытался бы запретить повторы.
- Использовал бы payment_event_id как unique_key и Delta merge с ограничением по event_time на повторно обрабатываемое 2-часовое окно.
- Удалял бы дубли пакета по payment_event_id, выбирая победителя детерминированно по source_sequence, а не по порядку загрузки.
- Вычислял бы суммы, статусы и временные метки только из полей источника, чтобы время перезапуска не меняло сохраненные значения.
- Записывал бы batch_start, batch_end, input_count и output_count в таблицу аудита и принимал повтор только после сверки этих счетчиков.
Зачем это спрашивают: Стабильные ключи, детерминированные победители и вычисления заставляют повторную обработку сходиться к исходному результату.
Я разделил бы работу по event_time, чтобы каждый пакет имел фиксированные границы сканирования и мог быть перезапущен независимо.
- Настроил бы микробатчи dbt с event_time и batch_size в 1 час, получив примерно 500 ГБ на пакет.
- Запускал бы параллельно до 6 часовых пакетов после замера конкурентной нагрузки на warehouse, а не все 24 сразу.
- Установил бы lookback в 2 пакета, чтобы повторно обрабатывать предыдущие 2 часа, и выполнял merge по telemetry_id для поздних событий.
- Сохранял бы статус пакетов, повторял только неуспешные часы и затем сравнивал сумму 24 почасовых счетчиков с итогом в слое загрузки.
Зачем это спрашивают: Часовые микробатчи ограничивают каждый запрос, позволяют управлять параллельностью и снижают стоимость повторной обработки ошибок.
Я сохранил бы атомарный факт для детализации, а дашборды обслуживал бы из меньшего агрегата с явно заданной гранулярностью.
- Определил бы fct_clicks на уровне одной строки на click_id, а dim_customer на уровне одной строки на customer_id, с проверками связей на свежих партициях.
- Инкрементально строил бы agg_campaign_day на уровне campaign_id, event_date и customer_segment, а не соединял 90 миллиардов строк во время запроса.
- Разбил бы факт и агрегат на партиции по event_date, а факт кластеризовал бы по campaign_id и customer_id для отсечения данных.
- Пересчитывал бы последние 3 дня агрегата и сверял клики и расходы с атомарным фактом перед публикацией.
Зачем это спрашивают: Проверенный атомарный слой и узкий дневной агрегат сохраняют детализацию и укладываются в целевое время дашборда.
Я задал бы диапазон дат явно и заменял только затронутые партиции перезапускаемыми порциями.
- Передавал бы backfill_start и backfill_end как переменные dbt и отклонял в логике модели любой диапазон длиннее 90 дней.
- Обрабатывал бы по 7 дневных партиций за запуск через BigQuery insert_overwrite, чтобы каждая порция перезаписывала около 3,5 ТБ.
- Сохранял бы завершенные диапазоны дат в таблице аудита и перезапускал только неуспешную порцию, поскольку каждая замена идемпотентна.
- Сверял бы число строк, taxable_amount и tax_amount по каждой дате, а затем запускал обычную инкрементальную обработку начиная с 91-го дня.
Зачем это спрашивают: Явные границы и замена партиций ограничивают стоимость сканирования и позволяют безопасно продолжить с последней завершенной порции.
Я моделировал бы одну текущую строку на subscription_id и явно сохранял состояние удаления.
- Удалял бы дубли каждого пакета по subscription_id с сортировкой по PostgreSQL LSN по убыванию, чтобы побеждало последнее изменение базы данных.
- Выполнял бы merge по subscription_id и для записей удаления сохранял deleted_at и is_deleted вместо неотслеживаемого физического удаления.
- Ограничивал бы источник значениями LSN выше последней успешной контрольной точки с перекрытием в 1 час для повторной доставки.
- Проверял бы уникальность subscription_id и для каждого пакета сравнивал с Debezium число операций вставки, обновления и удаления.
Зачем это спрашивают: Сортировка по позиции в журнале базы данных дает детерминированное текущее состояние при дублирующихся и пришедших не по порядку изменениях.
Я пересчитывал бы только пользователей, чьи недавние события могут изменить границу сессии.
- Читал бы события за 48-часовое окно по event_time и собирал уникальные user_id, затронутые в этом окне.
- Загружал бы предыдущее граничное событие этих пользователей, заново строил затронутые сессии и создавал детерминированный session_id из user_id и session_start.
- Заменял бы только партиции event_date с перестроенными сессиями, жестко ограничив запуск максимум 3 дневными партициями.
- Сверял бы число событий между перестроенными сессиями и источником, а события старше 48 часов направлял бы в ограниченную задачу исправления.
Зачем это спрашивают: Пересчет по затронутым пользователям учитывает границы сессий между окнами и ограничивает обычное сканирование свежими партициями.
Я бы сохранил историю SCD, но перестал бы передавать все 4 миллиарда исходных строк в каждый запуск snapshot.
- Собрал бы набор кандидатов из CDC-потока источника или из строк, чей timestamp загрузки больше сохраненного high-water mark, с запасом по времени для опоздавших записей.
- Оставил бы dbt snapshot поверх этого набора и кластеризовал snapshot-таблицу по бизнес-ключу и dbt_valid_from, чтобы Snowflake отсекал лишние данные на целевой стороне MERGE.
- Обрабатывал бы ограниченные микробатчи, например по 15 минут или 5 миллионов ключей, и сдвигал high-water mark только после успешного завершения батча snapshot.
- Ежедневно сверял бы измененные партиции источника и отслеживал число кандидатов, добавленных версий, обновленных версий, время работы и объем сканирования.
Зачем это спрашивают: Так история версий сохраняется, а объем часовой обработки зависит от числа измененных ключей, а не от размера всей таблицы.
Я бы не доверял стратегии timestamp, пока updated_at не отражает каждое бизнес-изменение, историю которого нужно сохранить.
- Сначала проверил бы контракт с командой источника и сопоставил неделю данных PostgreSQL WAL или аудита с бизнес-изменениями, при которых updated_at не поменялся.
- Если updated_at можно исправить и сделать монотонным, выбрал бы timestamp, потому что индексированное поле дает дешевую инкрементальную фильтрацию при таком объеме.
- До исправления использовал бы check с явным списком полей, например status, plan_id, owner_id и billing_country, исключив шумные метаданные вместо check_cols: all.
- Добавил бы поток изменений на стороне источника или watermark загрузки, чтобы dbt хешировал только строки-кандидаты, и тестировал бы, что выбранные изменения из WAL создают новую версию snapshot.
Зачем это спрашивают: Выбор сначала зависит от корректности фиксации изменений и только потом от стоимости сканирования.
Я бы определял удаления по проверенному полному набору ключей, потому что отсутствие строки в инкрементальном батче ничего не доказывает.
- Ежедневно загружал бы в BigQuery полный набор ID активных аккаунтов Salesforce с партиционированием по дате выгрузки и отклонял его при падении полноты ниже согласованного порога.
- Запускал бы отдельный ежедневный dbt snapshot по этому полному текущему набору с hard_deletes в режиме new_record, чтобы пропавшие ключи закрывали активные версии и получали явную запись удаления.
- Сохранял бы предыдущие версии с dbt_valid_from и dbt_valid_to и публиковал dbt_is_deleted, чтобы потребители отличали удаление от изменения атрибутов.
- До публикации сверял бы число активных ключей, найденных удалений и возраст выгрузки, измеряя требование 24 часов от успешной выгрузки источника.
Зачем это спрашивают: Проверенная сверка полного набора ключей отличает настоящее удаление от неполной загрузки коннектора.
Я бы перестроил временные линии затронутых клиентов из упорядоченных событий изменений, а не исправлял отдельные даты окончания.
- Для каждого затронутого бизнес-ключа удалил бы дубли событий с детерминированным разрешением совпадений по source_updated_at, ingestion_sequence и event_id.
- Рассчитал бы valid_from из времени фактического действия изменения, а valid_to через LEAD(valid_from), используя полуоткрытый интервал с включенным valid_from и исключенным valid_to.
- Заменил бы все версии только для затронутых ключей в одной транзакции Snowflake, чтобы читатели не увидели частично исправленную временную линию.
- Добавил бы dbt-тесты на одну текущую строку для ключа, отсутствие пересечений интервалов, valid_to больше valid_from и уникальность ключа версии измерения.
Зачем это спрашивают: Полный пересчет временной линии ключа делает поздние исправления и границы интервалов детерминированными.
Я бы сразу загружал факты с контролируемым неразрешенным ключом, а после прихода измерения пересчитывал только затронутые факты.
- Сохранял бы бизнес-ключ клиента и event_time в промежуточной Delta-таблице фактов, назначая surrogate key 0 неразрешенным клиентам вместо удаления строки или подбора сомнительного соответствия.
- Вел бы таблицу повторных попыток по бизнес-ключу клиента и затронутым партициям даты события, затем искал бы версию SCD2, действовавшую в event_time факта.
- Через Databricks MERGE обновлял бы только неразрешенные или новые затронутые строки фактов, сохраняя исходное время события и метаданные загрузки.
- Отслеживал бы число и возраст неразрешенных фактов по источникам, предупреждал до нарушения двухдневного ожидания и помещал в карантин факты, которые не разрешились за установленный срок.
Зачем это спрашивают: Факт доступен сразу после поступления, а позже получает версию измерения, действовавшую в момент события.
Я бы зафиксировал гранулярность основного факта продаж как одну строку на order_item_id, а суммы моделировал бы на том уровне, где они возникают.
- Хранил бы количество товара, валовую сумму товара и его налог в факте товарной позиции, используя order_id как вырожденное измерение для группировки.
- Хранил бы доставку, купоны и платежи в фактах уровня заказа, если бизнес не утвердил детерминированное распределение, например пропорционально чистой стоимости товаров.
- Моделировал бы возвраты с одной строкой на refund_line_id, потому что один товар можно возвращать несколько раз, и агрегировал бы их до соединения с уровнем товарной позиции.
- Добавил бы dbt-тест на уникальность order_item_id и сверку суммы товарных и заказных фактов с ежедневными контрольными итогами платежного провайдера.
Зачем это спрашивают: Явная гранулярность не дает суммам уровня заказа повторяться в каждой строке товара.
Я бы сначала доказал мультипликативное соединение, а затем привел каждую присоединяемую метрику к гранулярности запроса.
- Сравнил бы число строк и SUM(order_revenue) после каждого JOIN и посчитал дочерние строки на заказ, чтобы показать умножение 4 на 1,5.
- Агрегировал бы order_items до одной строки на заказ и payments до одной строки на заказ в отдельных моделях dbt до соединения любого результата с orders.
- В LookML указал бы реальные relationships и primary keys, но не полагался бы на symmetric aggregates как способ скрыть неверную гранулярность SQL.
- Добавил бы тесты гранулярности для каждой агрегированной модели и сверку выручки Explore с доверенным итогом уровня заказа.
Зачем это спрашивают: Предварительная агрегация независимых связей один-ко-многим убирает декартово умножение, которое дублирует метрики.
Я бы использовал два факта, потому что процессы отвечают на разные вопросы и обновляются по-разному.
- Для accumulating snapshot сделал бы одну строку на fulfillment_order_id с полями ordered_at, packed_at, shipped_at, delivered_at и current status, обновляя строку по мере прохождения этапов.
- Рассчитывал бы длительность циклов по этим полям этапов, а исходный факт событий хранил бы отдельно, если аналитикам нужны все переходы или исправления.
- Для periodic snapshot сделал бы одну строку на store_id, sku_id и snapshot_date с ежедневными значениями on-hand, reserved и available inventory, даже если ничего не изменилось.
- Настроил бы кластеризацию и срок хранения под способ чтения каждой таблицы, а также проверял уникальность уровня заказа для accumulating fact и уровня магазин-SKU-дата для periodic fact.
Зачем это спрашивают: Accumulating snapshot отслеживает конечный процесс, а periodic snapshot сохраняет состояние в регулярные моменты наблюдения.
Я бы заменил идентификаторы, зависящие от sequence, на детерминированные хеши и разделил идентичность товара и его исторической версии.
- Создал бы постоянный ключ товара, хешируя каноническое представление исходной системы и бизнес-ключа товара через dbt_utils.generate_surrogate_key.
- Создал бы ключ версии из постоянного ключа товара, valid_from и стабильного ID исходного события, чтобы две версии SCD2 не получили одинаковый ключ.
- Нормализовал бы типы, часовые пояса, пробелы, регистр и обработку null до хеширования и не объединял бы исходные поля без разделителей или маркеров null.
- Проверял бы уникальность и отсутствие null, сохранял естественные ключи для отладки и сравнивал выборку ключей между production и перестроенным окружением.
Зачем это спрашивают: Детерминированные ключи идентичности и версии сохраняют соединения фактов при полном перестроении и переносе между окружениями.
Я бы зафиксировал и состояние входных данных, и версию преобразований до пересчета любой партиции.
- Записал бы Apache Iceberg snapshot ID для каждой исходной таблицы и явно читал эти snapshots, чтобы файлы, пришедшие во время запуска, не меняли набор входных данных.
- Запускал бы проект dbt с фиксированного Git SHA, закрепленными версиями пакетов, настройками хранилища, часовым поясом, версией валютных курсов и другими внешними справочниками.
- Удалял бы дубли с полным порядком по event_time, Kafka partition, offset и event_id и не использовал бы недетерминированные функции или выбор первого значения без сортировки.
- Идемпотентно записывал бы каждый месяц во временную таблицу, сверял число строк и денежные контрольные суммы с манифестом запуска, а затем атомарно заменял целевые партиции.
Зачем это спрашивают: Зафиксированные данные, код, порядок и атомарная публикация дают одинаковый исторический результат при повторном перестроении.
Закрытые вопросы
- 21
Нужно опубликовать метрику paid_orders по таблице orders на 10 миллионов строк. Каждая строка соответствует одному заказу, order_id уникален, account_id обязателен, время хранится в UTC, а аналитикам нужны дневные значения по аккаунтам. Какой точный семантический контракт вы зададите?
- 22
В модели order_items 35 миллионов строк, по одной на позицию заказа. В таблице-связке тегов 80 миллионов строк, потому что у позиции может быть до 5 тегов. Продукту нужна выручка по тегам, причем сумма по тегам должна точно совпадать с общей выручкой. Как смоделировать это в MetricFlow или другом семантическом слое без размножения строк?
semantic-layermonitoring - 23
Определите метрику конверсии из сессии в покупку за 7 дней для 12 клиентских аккаунтов. События приходят в UTC, у каждого аккаунта есть часовой пояс IANA, в одной сессии может быть несколько покупок, а дашборд группирует когорты по локальному календарному дню начала сессии. Какие точные правила времени и гранулярности вы используете?
cohortsmonitoringsessions - 24
Финансы используют фискальный календарь 4-4-5: неделя начинается в понедельник, финансовый год начинается в ближайший к 1 февраля понедельник, а в некоторых годах есть 53-я неделя. Семантический слой должен поддерживать фискальные неделю, квартал и год для дневной выручки с 2022 по 2032 год. Как вы это реализуете?
semantic-layer - 25
Ежедневный снимок содержит остатки 2 миллионов аккаунтов в EUR, USD и GBP. Финансам нужен общий остаток на конец месяца в USD. Складывать все дневные остатки за месяц нельзя, у части аккаунтов нет строки в последний день, а курсы валют публикуются раз в день. Как вы определите метрику?
snapshotmonitoring - 26
Текущая метрика active_accounts означает хотя бы один вход за последние 30 дней. Теперь продукт хочет считать хотя бы один экспорт отчета за последние 28 дней. Метрика используется в 14 дашбордах, 3 API-клиентах и двух квартальных целях. Как вы версионируете семантическое определение?
monitoringapi - 27
За апрель Looker показывает чистую выручку 8,42 миллиона USD, а Tableau 8,57 миллиона USD, разница составляет 1,8%. Оба инструмента должны использовать одну семантическую метрику, но Tableau обновляет выгрузку ночью, а Looker обращается к данным напрямую. Как установить и обеспечить совпадение?
monitoringbiqueries - 28
Постройте недельное удержание аккаунтов для B2B-продукта. Аккаунт попадает в когорту после первой успешной синхронизации данных, считается удержанным за неделю при хотя бы одной успешной синхронизации, события могут опаздывать на 72 часа, а график показывает недели с 0-й по 12-ю. Какие точные правила когорты и знаменателя вы зададите?
retentioncohorts - 29
Семантическая метрика показывает ARR для 40 000 клиентских аккаунтов в 4 регионах. Менеджеры по продажам могут видеть только назначенные им аккаунты, региональные руководители свой регион, финансы все регионы, а названия клиентов не должны попадать в BI-выгрузки для ролей продаж. Как обеспечить доступ, не дублируя метрику?
monitoring - 30
Нужно посчитать MRR на конец месяца по сегментам клиентов. В mrr_snapshots хранится одна строка на подписку и конец месяца, а customer_segment_history представляет SCD Type 2 с полями valid_from и valid_to. Около 6% клиентов меняют сегмент каждый год. Как смоделировать связь сущностей, чтобы исторический MRR не переписывался?
joins - 31
Запрос дашборда в BigQuery сканирует 4,2 ТБ и стоит около $21 за одно обновление, хотя пользователи смотрят только последние 7 дней таблицы событий за 2 года. Как сократить сканируемые байты и доказать результат?
queriesbigquery - 32
Таблица BigQuery объёмом 6 ТБ уже разбита на дневные партиции, но дашборд одного клиента всё равно сканирует 180 ГБ одной партиции ради 2000 строк. Обычно фильтры используют tenant_id и event_name. Что вы измените?
partitioningbigquery - 33
В Snowflake запрос фильтрует 90 дней таблицы orders за 5 лет объёмом 14 ТБ, но сканирует 82% её микропартиций. Таблица получает обновления не по порядку. Как диагностировать и улучшить pruning?
queriespartitioningsnowflake - 34
Модель dbt в Snowflake выполняется 38 минут на warehouse X-Small и 7 минут на Large. Запуск на Large расходует 0,93 кредита против 0,63 на X-Small. Какой размер вы выберете и что сначала изучите?
warehousesnowflakedbt - 35
BI warehouse в Snowflake обслуживает 900 коротких запросов в день в 15 предсказуемых окнах активности. При AUTO_SUSPEND в 60 секунд он возобновляется 140 раз в день, а каждое возобновление имеет минимальную оплату за 60 секунд. Как это настроить?
querieswarehousesnowflake - 36
В 9 утра 40 запросов дашбордов стоят в очереди за 20-минутной трансформацией Snowflake на одном Medium warehouse. Увеличение до Large ускоряет трансформацию, но p95 дашбордов остаётся 70 секунд. Что вы измените?
querieswarehousesnowflake - 37
В таблице фактов Redshift 2 миллиарда строк, и одному клиенту принадлежит 42% из них. Таблица распределена по tenant_id, узлы показывают перекос строк в 4,8 раза, а joins сбрасывают данные на диск. Как изменить дизайн таблицы?
joinsmodelingredshift - 38
Инкрементальный merge в dbt читает 40 ГБ изменённых данных источника, но сканирует таблицу назначения объёмом 12 ТБ и выполняется 52 минуты. Поздние обновления приходят в течение 5 дней. Как сократить работу без потери исправлений?
dbt - 39
Переиспользуемую модель revenue ежедневно используют 18 дашбордов. В виде view каждое использование сканирует около 900 ГБ, а материализация в таблицу требует часового обновления со сканированием 120 ГБ. Как выбрать материализацию?
- 40
Расходы на warehouse выросли с $48 000 до $71 000 в месяц, но финансовая команда не может определить, какой домен dbt или дашборд вызвал рост. Как построить атрибуцию хотя бы 90% расходов?
warehousedbt - 41
В dbt-проекте 2 400 моделей и 12 000 связей, а ночная сборка занимает 75 минут. Как за две секунды показать все затронутые модели выше и ниже по графу после изменения одной модели, не обращаясь к хранилищу?
querieswarehousedependencies - 42
У вас 500 dbt-моделей, 18 BI-exposures и финансовый дашборд, который должен быть готов к 07:30 после 70-минутного окна трансформаций. Как с помощью exposures расставить приоритеты и проверить этот SLA?
dbt - 43
В хранилище 900 dbt-моделей и 14 000 столбцов, а для планируемого переименования customer_id нужно за 15 минут подготовить отчёт о влиянии. Как построить надёжный column lineage, если dbt manifest в основном описывает зависимости на уровне моделей?
schemawarehousedependencies - 44
Платформа запускает 1 200 dbt-моделей внутри Airflow, а также 6 000 ежедневных Spark-задач и задач загрузки данных, при этом полное окно обработки равно 90 минутам. Как с помощью OpenLineage связать эти системы без дублирующихся и неоднозначных запусков?
dbtairflowsystem-design - 45
В dbt-репозитории 1 100 моделей, таблица событий на три миллиарда строк, 180 измерений и лимит CI в 22 минуты. Как распределить проверки между generic и singular tests, не сканируя всю таблицу событий в каждом pull request?
coveragegenericscode-review - 46
Модель dbt на 260 строк обрабатывает курсы валют с периодом действия, пустую валюту и платежи, пришедшие с опозданием, но каждая проверка в хранилище занимает восемь минут. Как создать набор unit tests, который завершится меньше чем за 60 секунд?
hypothesis-testingvalidationfundamentals - 47
Вы заменяете модель выручки с полным обновлением на 2,4 миллиарда строк инкрементальной версией, которая должна завершаться за 45 минут. Какие reconciliation tests вы запустите, если построчное сравнение слишком дорого?
reacttesting - 48
Production-сборка 1 800 dbt-моделей занимает 70 минут, но CI для pull request ограничен 12 минутами. Как применить state selection и deferral, не позволив CI скрыть проблемы зависимостей?
dependenciesbuilddbt - 49
Модель с контрактом на 60 столбцов питает 36 дашбордов к 08:00, а вам нужно за два релиза переименовать customer_segment и добавить обязательный segment_source. Как изменить схему, не требуя одновременного обновления всех потребителей?
schemafundamentals - 50
Пять dbt-проектов независимо выпускаются каждую неделю, предоставляют 40 общих моделей и содержат 300 межпроектных ссылок. Как обеспечить совместимость, если потребители не могут обновиться в одном релизе?
dbt - 51
В 10:05, через двадцать минут после merge dbt, финансы сообщают, что сегодняшняя чистая выручка на 18,4% выше данных платежного провайдера по 2,1 млн транзакций за день, а в 11:00 начинается встреча руководства с этим дашбордом. Что вы сделаете?
transactionsconcurrencydbt - 52
После изменения модели число активных пользователей за неделю на дашборде роста увеличивается с 420 000 до 687 000 при join 900 млн событий с таблицей истории аккаунтов на 14 млн строк, а распределение рекламного бюджета начнется через 90 минут. Как вы поступите?
soft-skillsjoins - 53
В 08:30 операционная команда сообщает, что дашборд все еще показывает вчерашние 3,8 млн заказов, хотя в хранилище уже 4,1 млн, каждое утро его открывают 600 менеджеров, а SLA свежести установлен на 07:00. Как вы ответите?
warehouse - 54
Релиз в 14:00 меняет общую dbt-модель измерения, и к 14:25 падают двенадцать зависимых моделей, при этом часовой pipeline выручки должен завершиться в 15:00 и обслуживает бизнес с оборотом $9 млн в день. Вы откатитесь или будете исправлять вперед?
rollbackdbtci-cd - 55
В 16:00 платежный источник присылает исправление, которое переносит €1,7 млн выручки с 30 июня на 1 июля в 82 000 записей, хотя июньские цифры для совета директоров уже выгрузили в 09:00. Как вы обработаете исправление?
concurrency - 56
В 02:10 upstream-релиз переименовывает customer_id в customer_uuid в ежедневном источнике на 35 млн строк и ломает 27 dbt-моделей; отчетность поддержки открывается в 07:00 и нарушит четырехчасовой SLA, если восстановление займет больше 50 минут. Что вы сделаете?
deploymentdbt - 57
Пересчет за шесть месяцев и 4,6 млрд событий завершается через 11 часов, но конверсия падает с 4,8% до 3,1%, а число платных конверсий уменьшается на 210 000; маркетинг представляет результат через два часа. Как вы отреагируете?
conversionbackfill - 58
После деплоя инкрементальной модели ежедневная выручка от подписок ровно на 7,2% выше нормы три дня подряд, обработано 19 млн строк, а через 70 минут будут сформированы счета на $640 000. Расследование показывает, что повторные запуски могли вставить дубли событий подписки. Что вы сделаете?
deploymentconcurrency - 59
В 12:15 дашборд CEO показывает выручку с начала месяца $12,6 млн, а финансы сообщают $11,9 млн, при этом встреча совета директоров начинается в 13:00 и спорные $700 000 относятся к 48 000 заказов. Обе команды утверждают, что их запрос верен. Как вы возглавите инцидент?
incidentsqueries - 60
В 09:20 задание хранилища перезаписывает 31 день таблицы статусов клиентов только последним днем, сокращая ее с 780 млн до 26 млн строк; затронуты 34 дашборда и экспорт оттока со сроком в 10:30. Как вы восстановитесь?
churnwarehouse - 61
Ночной dbt run вырос с 41 до 89 минут после одного merge и теперь нарушает SLA в 60 минут. Как вы проведёте диагностику и решите, нужен ли rollback?
rollbackdbt - 62
В 05:45 прогноз завершения dbt DAG из 1500 моделей составляет 82 минуты, но payroll dashboard должен обновиться к 06:30 и зависит от 96 upstream models. Запустите ли вы только часть DAG?
dbt - 63
Snowflake dbt build теперь занимает 64 минуты: 17 минут проходят в очереди, а одна модель сбрасывает 1,6 ТБ в remote storage, пока dashboards на 09:00 используют тот же warehouse. Что вы сделаете?
warehousesnowflakedata-structures - 64
Оператор случайно запустил full refresh для 70 ТБ dbt models; через 18 минут заменены 23 из 140 relations, а прогноз стоимости составляет 4800 долларов. Как вы отреагируете?
dbt - 65
dbt CI job со state и defer выбирает 8 моделей, но diff manifest с production показывает 312 затронутых descendants, а одна пропущенная модель обращается к удалённой колонке. Как вы проведёте расследование и containment?
schemadbt - 66
Критичная dbt model падает в 4 из 12 запусков через 27-35 минут, а затем обычно проходит retry без изменения кода. Как вы разберётесь с flaky behavior, не превращая retries в норму?
normalizationresiliencedbt - 67
Orchestrator завершился по timeout через 29 минут, хотя dbt query успел сделать commit, а retry затем добавил ещё 14 миллионов строк и завысил revenue на 2,3%. Что вы сделаете?
resilienceorchestrationqueries - 68
Refactor затрагивает 960 узлов в dbt DAG из 1800 моделей, representative build занимает 52 минуты, а CI для pull request имеет жёсткий лимит 15 минут. Как вы примете решение о release?
refactoringdbt - 69
После крупного DAG refactor production build из 1600 моделей вырос с 52 до 76 минут и нарушил SLA в 60 минут, хотя общие warehouse credits не изменились. Как вы восстановитесь и оцените refactor?
refactoringbuildwarehouse - 70
Нужно сделать backfill за 120 дней по 5 ТБ в день за 72 часа; benchmark показывает 15 ТБ в час на выделенном warehouse, но production потребляет 65% общей capacity. Какой план вы одобрите?
capacitybackfillwarehouse - 71
Finance показывает квартальную выручку 24,6 млн долларов, Product показывает 25,0 млн, расхождение составляет 1,8%, а CFO нужен один показатель через 90 минут. Что вы сделаете?
- 72
Число оплаченных заказов за ночь выросло на 7,4%, но суммы расчётов платёжного провайдера не изменились; новое соединение с промоакциями могло задвоить заказы с двумя купонами. Как вы проведёте расследование и решите, нужен ли откат?
joinsrollback - 73
Finance считает ARR равным 82,3 млн долларов, Sales считает 86,1 млн, и оба значения используются в материалах для совета директоров, которые нужны завтра. Как вы разрешите конфликт?
- 74
Growth показывает retention на 30-й день 41%, а Product показывает 36% для одной и той же январской когорты из 120 000 пользователей. Как определить, какое определение когорты должно использоваться в планировании?
retentioncohorts - 75
Три продуктовые команды отказываются от общей метрики активных пользователей: их показатели за 28 дней равны 9,2 млн, 8,5 млн и 7,9 млн. Как вы сдвинете организацию с места?
monitoring - 76
Изменение определения churn снижает месячный показатель с 4,7% до 4,1% и меняет предыдущие 18 месяцев. Как вы решите, нужно ли пересчитать историю?
churn - 77
Live-дашборд BI показывает 3,42 млн заказов за неделю, его CSV-экстракт на 06:00 показывает 3,31 млн, и руководитель уже переслал CSV. Как вы проведёте расследование и отреагируете?
- 78
В 15:30 CEO спрашивает, нужно ли остановить запуск к 16:00, потому что conversion составляет 12,4% в одном дашборде и 11,1% в другом на 48 000 сессий. Что вы порекомендуете?
sessions - 79
Finance исключает возвраты, оформленные после закрытия месяца, а Product относит их к исходному заказу, из-за чего net revenue за март расходится на 2,6%. Как вы решите, что должен показывать каждый отчёт?
- 80
Новое семантическое определение повышает gross margin с 31,8% до 33,0% за два дня до публикации прогноза, а 14 дашбордов всё ещё используют старую формулу. Как вы управляете решением и переключением?
css - 81
Месячный счёт за warehouse вырос со $180 000 до $310 000, хотя объём данных увеличился только на 8%. Как вы расследуете и остановите рост и докажете экономию?
warehouse - 82
Backfill, запущенный одним аналитиком, потратил $28 000 за три часа и по прогнозу будет работать ещё 14 часов. Что вы сделаете сейчас и как решите, возобновлять ли его?
backfill - 83
Потребление Snowflake выросло с 9 000 до 16 000 кредитов в неделю, хотя объём строк и трафик дашбордов не изменились. Как вы проведёте расследование и отреагируете?
zero-to-onesnowflake - 84
Дашборд BigQuery сканирует 1,15 ТБ за обновление, обновляется 96 раз в день и теперь стоит около $690 в день. Как вы ограничите расходы и проверите устойчивое исправление?
bigqueryvalidation - 85
Конкуренция дашбордов выросла со 120 до 900 пользователей в 9 утра, p95 latency увеличилась с 6 до 42 секунд, а autoscaling поднял стоимость compute на 70%. Как восстановить сервис и не закрепить высокий счёт?
lockinglatencyconcurrency - 86
Продуктовая команда оспаривает chargeback на $74 000 из общего счёта warehouse в $110 000 и утверждает, что её помеченные запросы стоят только $29 000. Как разрешить спор и исправить модель?
querieswarehouse - 87
Счёт вендора observability вырос при продлении с $240 000 до $390 000, потому что число наблюдаемых активов увеличилось с 18 000 до 31 000. Как решить, за что платить, и доказать ценность?
observabilitymonitoringprocurement - 88
Хранение 7 ПБ аналитических данных стоит $161 000 в месяц, но закон требует семь лет для части записей, а аналитики используют только 12% таблиц после 90 дней. Какое решение по retention вы примете?
retention - 89
Руководство требует сократить квартальный счёт warehouse в $400 000 на 25%, но свежесть finance должна оставаться в пределах 30 минут, p95 дашбордов ниже 5 секунд, а доступность на уровне 99,5%. Как вы выберете сокращения?
warehouse - 90
Команда заявляет о годовой экономии warehouse в $420 000 после оптимизации, но за тот же период трафик запросов упал на 18%, а провайдер снизил цены на 7%. Как доказать вклад инженерных изменений?
querieswarehouseoptimization - 91
Вам нужно мигрировать 180 production marts в новый namespace с простоем записи менее 10 минут. Как вы спланируете переключение и откат?
rollbackkubernetes - 92
Компания переносит 80 ТБ, 420 моделей и 600 dashboards в новый cloud warehouse за 12 недель. Как вы выстроите миграцию без заморозки аналитики?
migrationswarehouse - 93
Вам нужно перенести 650 dashboards и 1 800 пользователей с одной BI-платформы на другую до истечения лицензии через 90 дней. Что вы сделаете?
- 94
Вам нужно мигрировать 900 аналитических задач по расписанию в новый orchestrator, сохранив SLA, retries и состояние backfill. Как вы это выполните?
orchestrationbackfill - 95
DAG из 2 400 узлов выполняется 86 минут при SLA 90 минут, но на рефакторинг есть только 3 инженера и 6 недель. Как вы снизите риск и runtime?
refactoring - 96
Инцидент с данными завысил недельную выручку на 8% на 36 часов, и руководители продаж больше не доверяют dashboards. Как вы восстановите доверие бизнеса?
incidents - 97
Через 2 часа после заседания совета директоров вы обнаружили, что валовая маржа составляла 31,4%, а не 34,1%. Как вы исправите отчёт и исходный процесс?
cssconcurrency - 98
В вашем dbt-проекте 1 300 моделей, и данные использования показывают, что сотни устарели. Как вы выведете их из эксплуатации, не сломав неизвестных потребителей?
dbt - 99
Команда источника удалит customer key через 10 дней, нарушив контракт, который используют 14 команд и 75 downstream-моделей. Как вы обработаете межорганизационную поломку?
- 100
Через 90 минут после начала переключения миграции warehouse 22% сертифицированных метрик не проходят паритет, а задержка dashboards выросла втрое. Что вы сделаете?
migrationswarehouselatency