Middle Data Engineer на проект крупного банка: Python, ETL, PySpark, RAG/LLM и потоковая обработка данных
Фишка: У каждого сотрудника есть ресурсный менеджер-наставник с личным планом развития; поэтапный онбординг и возможность смены проекта внутри Aston
| Этап | Длительность | Что проверяют |
|---|---|---|
| HR-скрининг | 30–45 мин | Мотивация, опыт 3+ лет в DE, готовность к удалённой работе, знание стека вакансии, ожидания по зарплате и формату |
| Техническое интервью (Aston) | 60–90 мин | Python, SQL, ETL-пайплайны, Airflow/Argo, PySpark, основы RAG и векторных БД; разбор прошлых проектов |
| Техническое интервью (заказчик — банк) | 60–90 мин | Глубокая проверка стека проекта: отказоустойчивые ETL-сервисы, embeddings для LLM, Kafka/Flink, live-coding SQL или Python |
| Финальное согласование | 15–30 мин | Условия, старт на проект, онбординг через ресурсного менеджера Aston |
Обязательный минимум
Плюсом будет
Какой язык программирования используется для пайплайнов и микросервисов?
Python — основной для DE в банковских проектах. Упомяни asyncio, aiohttp/httpx для REST, структуру ETL-модулей, type hints, логирование и retry-политики.
Расскажи про опыт работы с Docker
Контейнеризация ETL-сервисов и Airflow workers. Образы, docker-compose для локальной разработки, переменные окружения, healthcheck.
Как происходил парсинг и обработка данных?
Extract → валидация схемы → трансформация → load. Упомяни pandas/Pydantic, обработку JSON/CSV/API, идемпотентность и обработку ошибок.
Фишка: На проекте ключевы async REST-вызовы (aiohttp, httpx) — будь готов написать или объяснить async/await паттерн с семафором и retry.
Ловушка: Не путай многопоточность (threading) и асинхронность (asyncio) — для I/O-bound задач (API, Kafka) нужен именно async.
Что такое нормальные формы и какие существуют?
1NF — атомарность; 2NF — нет частичных зависимостей; 3NF — нет транзитивных зависимостей. BCNF — усиленная 3NF. Для OLAP часто денормализуют.
Что такое индексы в базах данных и зачем они нужны?
B-tree, hash, composite. Ускоряют SELECT, замедляют INSERT/UPDATE. EXPLAIN/план запроса. Покрывающие индексы.
Что такое шардирование баз данных и зачем оно нужно?
Горизонтальное разделение данных по ключу шарда. Масштабирование записи/чтения. Сложности: cross-shard JOIN, ребалансировка.
Приведи примеры спроектированной базы данных с денормализацией
Звезда/снежинка для DWH, дублирование атрибутов для скорости чтения, материализованные представления. Trade-off: скорость vs консистентность.
Почему не работать напрямую с исходной базой?
Нагрузка на OLTP, блокировки, безопасность, отсутствие истории. Промежуточный слой (staging, DWH, lake) изолирует аналитику от продакшена.
Совет: Готовь 2–3 сложных SQL-запроса: оконные функции (ROW_NUMBER, LAG), CTE, агрегации с GROUPING SETS.
Ловушка: На вопрос про индексы не забывай про селективность — индекс на поле с 2 значениями бесполезен.
Что такое ETL?
Extract — извлечение из источников; Transform — очистка, агрегация, обогащение; Load — загрузка в целевое хранилище. ELT — загрузка сначала, трансформация в DWH.
Как выявлять аномалии данных?
Статистика: Z-score, IQR. ML: Isolation Forest. Правила: null-rate, дубликаты, schema drift. Great Expectations / dbt tests.
Приходилось ли работать с методологиями разработки?
Agile/Scrum — спринты, daily, ретро. Kanban — WIP-лимиты. Для DE: code review DAG-ов, CI/CD пайплайнов, документация data contracts.
Фишка: Вакансия требует промышленные отказоустойчивые ETL на Airflow и Argo Workflows — расскажи про idempotency, backfill, SLA, alerting при падении DAG.
Совет: Опиши конкретный DAG: источник → валидация → трансформация → load → уведомление. Упомяни XCom, Sensors, retry с exponential backoff.
В чём разница между MapReduce и Apache Spark?
MapReduce — диск между этапами, медленнее. Spark — in-memory DAG, lazy evaluation, RDD/DataFrame API, в 10–100x быстрее на итеративных задачах.
Что такое Hadoop?
HDFS + MapReduce + YARN. Экосистема: Hive, HBase, Sqoop. Spark часто работает поверх YARN/K8s, HDFS или S3.
В чем разница между партицированием и шардированием?
Партицирование — логическое деление таблицы внутри одного кластера (по дате/ключу). Шардирование — физическое распределение по разным серверам/кластерам.
Всегда ли spill на диск это плохо?
Нет — при нехватке памяти spill неизбежен. Плохо, если spill частый: настрой shuffle partitions, broadcast join, увеличь executor memory.
Ловушка: collect() на большом DataFrame убьёт driver — используй take(), write.parquet() или агрегацию до collect.
Совет: Знай разницу narrow vs wide transformations, когда нужен repartition vs coalesce.
Какую задачу решает тюнинг модели трансформера?
Fine-tuning адаптирует предобученную модель под домен (банковские документы). RAG дополняет контекст без переобучения — retrieval + prompt injection.
Опиши пайплайн RAG для обогащения LLM контекстными данными
Chunking документов → embedding (OpenAI/Cohere/sentence-transformers) → vector store → query embedding → top-k retrieval → prompt assembly → LLM inference.
Фишка: Ключевое требование вакансии — промышленный сервис embedding + векторное хранилище для RAG. Расскажи про batch и streaming ingestion embeddings.
Ловушка: Не путай embedding model и LLM — embedding создаёт вектор, LLM генерирует текст. Разные модели, разные ресурсы.
Какие сервисы облачных платформ использовали?
AWS: S3, EMR, MSK. GCP: BigQuery, Dataflow. Azure: Data Factory, Event Hubs. Для банка — часто on-prem + S3-совместимое хранилище.
Совет: Знай семантику доставки: at-most-once, at-least-once, exactly-once. Для Flink — checkpointing и state backend.
Фишка: Плюсом будет опыт aiokafka/confluent-kafka и Flink — consumer groups, offset management, watermarking.
В чем разница между OLAP и OLTP?
OLTP — транзакции, нормализация, много мелких записей. OLAP — аналитика, денормализация, агрегации, колоночное хранение, batch-загрузка.
Какой алгоритм лежит в основе модели?
Для DE чаще спрашивают про ML в контексте RAG/аналитики. Знай gradient boosting (CatBoost, XGBoost) для табличных данных, если затронут ML.
Совет: Parquet — колоночный, сжатие, predicate pushdown. ORC — аналог для Hive. Выбор зависит от экосистемы (Spark → Parquet).
Ловушка: Колоночный формат эффективен для аналитических запросов по подмножеству столбцов, но не для point-lookup по строке.
Расскажите про опыт в аналитике данных, проекты и курсы
Структура: задача → стек → масштаб данных → результат (метрика). Акцент на DE-проекты, не только DS.
Приходилось ли работать с визуализацией данных?
Superset, Grafana, Tableau, Metabase. Для DE — мониторинг пайплайнов и data quality dashboards.
Как проводится A/B тестирование?
Гипотеза → рандомизация → размер выборки (power analysis) → метрика → статзначимость (p-value, CI) → решение.
Что такое доверительный интервал?
Диапазон [L, U] с уровнем доверия 95%: истинный параметр попадёт в интервал в 95% повторений эксперимента.
В чем разница Agile и Waterfall?
Waterfall — последовательные фазы, фиксированные требования. Agile — итерации, обратная связь, гибкость. DE в банке — обычно Scrum.
Совет: Aston ценит soft skills и готовность к менторству — упомяни опыт code review и помощи коллегам.
SQL: скользящее среднее по транзакциям
Есть таблица transactions(user_id, amount, created_at). Напишите SQL-запрос: для каждого пользователя вернуть сумму amount за последние 7 дней (скользящее окно) на каждую дату транзакции.
SELECT user_id, created_at, amount,
SUM(amount) OVER (
PARTITION BY user_id
ORDER BY created_at
RANGE BETWEEN INTERVAL '7 days' PRECEDING AND CURRENT ROW
) AS rolling_7d_sum
FROM transactions;Сложность: O(n log n) при сортировке окна
Python: async загрузка данных из REST API
Напишите async-функцию fetch_all(urls: list[str]) -> list[dict], которая параллельно загружает JSON из списка URL с ограничением не более 5 одновременных запросов. При ошибке HTTP 5xx — retry до 3 раз.
import asyncio
import httpx
async def fetch_all(urls: list[str]) -> list[dict]:
sem = asyncio.Semaphore(5)
async with httpx.AsyncClient(timeout=30) as client:
async def fetch_one(url: str) -> dict:
async with sem:
for attempt in range(3):
resp = await client.get(url)
if resp.status_code < 500:
resp.raise_for_status()
return resp.json()
await asyncio.sleep(2 ** attempt)
resp.raise_for_status()
return await asyncio.gather(*[fetch_one(u) for u in urls])Сложность: O(n) запросов, параллелизм до 5
PySpark: агрегация логов по дням
Дан DataFrame logs(user_id, event_type, timestamp). Напишите PySpark-код: посчитать количество событий каждого event_type по дням (date из timestamp).
from pyspark.sql import functions as F
result = (
logs
.withColumn('date', F.to_date('timestamp'))
.groupBy('date', 'event_type')
.agg(F.count('*').alias('cnt'))
.orderBy('date', 'event_type')
)Сложность: O(n) с shuffle по (date, event_type)
Проектирование RAG-пайплайна для банковских документов
Спроектируйте batch-пайплайн: загрузка PDF-документов из S3 → chunking → embedding → сохранение в векторное хранилище. Опишите компоненты, оркестрацию и обработку ошибок.
1) Airflow DAG: Sensor на S3 prefix → List objects. 2) Spark/Python task: extract text (PyMuPDF) → chunk (512 tokens, overlap 50) → metadata (doc_id, page, date). 3) Embedding service: batch API (sentence-transformers / OpenAI) с rate limiting. 4) Vector store: upsert в Qdrant/pgvector с idempotency key = hash(chunk). 5) Ошибки: dead letter queue в S3 /_failed/, retry 3x, alert в Slack. 6) Мониторинг: кол-во chunks, latency, embedding dimension check.
Сложность: Batch O(docs × chunks)
Каркас ответа
3 дня
7 дней
14 дней
| Блок | Готов, если... |
|---|---|
| Python и async | можешь написать async fetch с Semaphore, retry и обработкой ошибок |
| SQL | решаешь задачи с оконными функциями и CTE за 15–20 минут |
| ETL / Airflow | описываешь DAG с idempotency, backfill, alerting и data quality checks |
| PySpark | пишешь groupBy/agg/join и объясняешь shuffle, spill, broadcast join |
| RAG / embeddings | рисуешь пайплайн ingestion → chunk → embed → store → retrieve |
| Kafka / streaming | объясняешь consumer groups, offset, at-least-once vs exactly-once |
| OLAP / форматы | различаешь OLTP/OLAP, Parquet/ORC, партицирование и шардирование |
| System Design | проектируешь ETL end-to-end с отказоустойчивостью и мониторингом |
| Behavioral | 3 кейса по STAR с метриками и уроками |
В день собеседования