Типичные ETL ловушки на собеседовании Data Engineer
Карьерник — Duolingo для аналитиков: 10 минут в день тренируй SQL, Python, A/B, статистику, метрики и ещё 3 темы собеса. 1500+ вопросов в Telegram-боте. Бесплатно.
Содержание:
Зачем разбирать на собесе
Senior DE — это not «знает как писать SQL», а «не наступит на known граблях». На собесе DE: «расскажи о баге в проде», «timezone проблема».
Timezone hell
Проблема. Данные из разных источников в разных TZ. Арифметика дат → дрейф.
Решения:
- ВСЁ в UTC в storage.
- Convert при display только.
- Use
TIMESTAMP WITH TIME ZONE(Postgrestimestamptz). - DST changes — особое внимание (некоторые часы существуют дважды или не существуют).
-- BAD: timezone-naive
created_at TIMESTAMP
-- GOOD
created_at TIMESTAMPTZNULL semantics
NULL = NULL → NULL (не TRUE).
Ошибки:
WHERE x = NULL— никогда не вернёт rows. ИспользуйIS NULL.NOT IN (subquery с NULL)— empty result.COUNT(col)игнорирует NULL,COUNT(*)— нет.SUMover NULL → NULL.AVGignore NULL.
Coalesce обязателен для arithmetic с возможным NULL.
Encoding
Кодировки. UTF-8 default, но часто встречается:
- Windows-1251 (CP1251) — старые Windows-системы.
- Latin1 (ISO-8859-1) — европейские.
- UTF-16 — Windows native.
Symptoms: странные characters (Ð, Ñ‚) в data.
Решение. Convert при ingest. Validate. Fail loud если encoding wrong, не tihо.
Idempotency
Pipeline может re-run. Если не idempotent — дубликаты при retry.
Решения:
- MERGE / UPSERT по unique key.
- DELETE-then-INSERT партиции.
- INSERT OVERWRITE PARTITION.
- Дедуп через row_number() partitioned by unique key.
Late-arriving data
Event с timestamp 2 days ago appears today.
Без handling: event пропадает (filter на recent only) или dublication.
Решения:
- Lookback window в incremental.
- Event time vs ingest time — разделить.
- Watermark (Spark Streaming).
Race conditions
Concurrent writes.
Time T1: read row → balance = 100
Time T2: read row → balance = 100
T1 + 50: write → 150
T2 + 30: write → 130 ← T1 update lostРешения:
- Optimistic locking (version column).
- Pessimistic (
SELECT FOR UPDATE). - Atomic operations (
UPDATE x SET balance = balance + 50).
В ETL чаще нет concurrency, но в OLTP — основной класс багов.
Связанные темы
- Идемпотентность пайплайна для DE
- Транзакции и MVCC для DE
- MERGE и UPSERT для DE
- DQ dimensions для DE
- Подготовка к собесу Data Engineer
FAQ
Это официальная информация?
Нет. Статья основана на индустриальном опыте.
Тренируйте Data Engineering — откройте тренажёр с 1500+ вопросами для собесов.