Типичные ETL ловушки на собеседовании Data Engineer

Готовься к собесу аналитика как в Duolingo
10 минут в день — SQL, Python, A/B, метрики. 1700+ вопросов в Telegram
Открыть Карьерник в Telegram

Карьерник — 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 (Postgres timestamptz).
  • DST changes — особое внимание (некоторые часы существуют дважды или не существуют).
-- BAD: timezone-naive
created_at TIMESTAMP

-- GOOD
created_at TIMESTAMPTZ

NULL semantics

NULL = NULL → NULL (не TRUE).

Ошибки:

  • WHERE x = NULL — никогда не вернёт rows. Используй IS NULL.
  • NOT IN (subquery с NULL) — empty result.
  • COUNT(col) игнорирует NULL, COUNT(*) — нет.
  • SUM over NULL → NULL.
  • AVG ignore 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о.

Готовься к собесу аналитика как в Duolingo
10 минут в день — SQL, Python, A/B, метрики. 1700+ вопросов в Telegram
Открыть Карьерник в Telegram

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 — основной класс багов.

Связанные темы

FAQ

Это официальная информация?

Нет. Статья основана на индустриальном опыте.


Тренируйте Data Engineering — откройте тренажёр с 1500+ вопросами для собесов.