docs(course): добавлен урок 1 и выровнена рамка под созвоны
- Зачем: - нужен первый урок курса по эталонному пути STG, а рамка курса описывала сопровождение как «сессию-сверку», хотя по факту это самостоятельная работа + еженедельный созвон. - Что: - добавлен docs/course/lessons/01_kafka_to_clickhouse.md (Kafka → ClickHouse, слой STG) по шаблону LESSON_STANDARD. - в sql/ddl/stg/10_stg.sql исправлен баг kafka_ts во всех 4 MV: toInt64(DateTime64) срезал миллисекунды, kafka_ts по всему стенду был 1970-01-21; теперь _timestamp_ms присваивается напрямую (downstream на kafka_ts не опирается). - урок 1 §3/§4 приведены к исправленному коду; врезка про рассинхрон MV↔таблица описывает реальное поведение (молчаливый сброс лишней колонки, не ошибка). - «сессия/сессия-сверка» → «созвон» в PRD (датированная поправка), LESSON_STANDARD §6 (секция «Что должно получиться») и README курса; добавлена ссылка на открытый DE-роадмап. - в LEARNING_PLAN исправлен вердикт аудита урока 1 (баг найден прогоном), war-story про toInt64(DateTime64) припаркована в урок 2. - Проверка: - прогон на стенде: make up && make ddl && LIMIT=50 make data → kafka_ts = 2026-… с миллисекундами; правка §4 (ALTER + пересоздание MV + TRUNCATE + перезаливка) и откат отработали. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -59,7 +59,7 @@ Kafka из роадмапа — оно даёт словарь терминов.
|
||||
|
||||
| Урок | Путь | Файлы | Вердикт |
|
||||
|------|------|-------|---------|
|
||||
| 1 | STG (Kafka→CH) | `sql/ddl/stg/10_stg.sql` | **годно как есть** (+1 строка «зачем») |
|
||||
| 1 | STG (Kafka→CH) | `sql/ddl/stg/10_stg.sql` | **точечно править** (баг конвертации `kafka_ts`, найден на стенде) |
|
||||
| 2 | STG→ODS | `sql/ods/20_stg_to_ods.sql` + DDL `sql/ddl/ods/20_ods.sql` | **точечно править** |
|
||||
| 3 | ODS→DDS (+ демоут DM) | `sql/dds/30_ods_to_dds.sql` + DDL `sql/ddl/dds/30_dds.sql`; DM `sql/dm/40_dds_to_dm.sql` + `sql/ddl/dm/40_dm.sql` | **точечно править** |
|
||||
| 4 | Airflow DAG | `airflow/dags/etl_pipeline_dag.py` | **точечно править** |
|
||||
@@ -73,12 +73,19 @@ Kafka из роадмапа — оно даёт словарь терминов.
|
||||
Правки точечные, делаем не отдельным забегом, а в составе соответствующего урока.
|
||||
|
||||
**Урок 1 — STG (`sql/ddl/stg/10_stg.sql`):**
|
||||
- [ ] Добавить одну строку «зачем» к `fromUnixTimestamp64Milli(toInt64(_timestamp_ms))`
|
||||
в MV — это единственный неочевидный трюк файла (конвертация Kafka-таймстампа).
|
||||
- [x] **Баг конвертации `kafka_ts` (найден прогоном на стенде 2026-06-03).**
|
||||
Было `fromUnixTimestamp64Milli(toInt64(_timestamp_ms))` во всех 4 MV: `_timestamp_ms`
|
||||
это `DateTime64(3)`, `toInt64()` срезает его до **секунд**, и `fromUnixTimestamp64Milli`
|
||||
читает секунды как миллисекунды → `kafka_ts` = `1970-01-21` по всему стенду.
|
||||
Исправлено на `_timestamp_ms AS kafka_ts` (прямое присвоение, мс сохраняются).
|
||||
Прежний аудит ошибочно пометил путь «годно как есть» — потому что его не прогоняли.
|
||||
- Колоночные комментарии-пересказы (`-- Партиция`, `-- Имя топика`) безвредны — не трогаем.
|
||||
- В финале урока — мост к уроку 2: вопрос «почему дальше не MV?».
|
||||
|
||||
**Урок 2 — STG→ODS, типизация + DQ-split (`sql/ods/20_stg_to_ods.sql` + DDL `sql/ddl/ods/20_ods.sql`):**
|
||||
- [ ] **Кандидат на war-story по типам:** баг `kafka_ts` из урока 1 (`toInt64(DateTime64)`
|
||||
молча срезал миллисекунды → 1970). Это идеальная иллюстрация темы урока — «тихая
|
||||
потеря данных на неверном типе». Решить при написании, давать ли как пример.
|
||||
- [ ] Добавить однострочный «поток данных» в шапку `20_stg_to_ods.sql`
|
||||
(`stg.*_raw → ods.* + ods.*_errors`) — п.3 чеклиста.
|
||||
- [ ] Добавить строку «зачем»: основная таблица = валидный ключ (но может иметь
|
||||
|
||||
Reference in New Issue
Block a user