feat(sql): нормализация JSON-полей в ODS для airports и airplanes
- Зачем:
- источник хранит мультиязычные названия как JSON ({"en": "...", "ru": "..."}),
- для упрощения downstream-логики (DDS/DM) нужны чистые строки на одном языке.
- Что:
- добавлен парсинг JSON с извлечением поля 'ru' в sql/ods/airports_load.sql
(airport_name, city, country).
- добавлен парсинг JSON с извлечением поля 'ru' в sql/ods/airplanes_load.sql
(model).
- обновлена документация docs/internal/bookings_ods_design.md с примечаниями
о нормализации.
- обновлены тестовые данные в tests/test_ods_snapshot_integration.py для
соответствия JSON-формату STG.
- Проверка:
- uv run make test (15 passed).
- SELECT airport_name FROM ods.airports → "Аль-Баха" (вместо JSON).
This commit is contained in:
@@ -96,9 +96,9 @@ ODS в учебном проекте — это:
|
||||
#### `ods.airports`
|
||||
```sql
|
||||
airport_code TEXT NOT NULL
|
||||
airport_name TEXT NOT NULL
|
||||
city TEXT NOT NULL
|
||||
country TEXT NOT NULL
|
||||
airport_name TEXT NOT NULL -- русское название, извлечено из JSON (поле 'ru')
|
||||
city TEXT NOT NULL -- русское название, извлечено из JSON (поле 'ru')
|
||||
country TEXT NOT NULL -- русское название, извлечено из JSON (поле 'ru')
|
||||
coordinates TEXT
|
||||
timezone TEXT NOT NULL
|
||||
_load_id TEXT NOT NULL
|
||||
@@ -106,10 +106,17 @@ _load_ts TIMESTAMP NOT NULL DEFAULT now()
|
||||
DISTRIBUTED BY (airport_code)
|
||||
```
|
||||
|
||||
> **Примечание о нормализации JSON**: Источник (`bookings.airports_data`) хранит
|
||||
> мультиязычные поля (`airport_name`, `city`, `country`) как JSON-объекты вида
|
||||
> `{"en": "...", "ru": "..."}`. На уровне ODS выполняется нормализация:
|
||||
> извлекается только русский вариант (`->>'ru'`). Это упрощает downstream-логику
|
||||
> (DDS/DM не нужно знать о внутренней структуре JSON) и соответствует принципу
|
||||
> "типизированные данные" на уровне ODS.
|
||||
|
||||
#### `ods.airplanes`
|
||||
```sql
|
||||
airplane_code TEXT NOT NULL
|
||||
model TEXT NOT NULL
|
||||
model TEXT NOT NULL -- русское название модели, извлечено из JSON (поле 'ru')
|
||||
range_km INTEGER
|
||||
speed_kmh INTEGER
|
||||
_load_id TEXT NOT NULL
|
||||
@@ -117,6 +124,10 @@ _load_ts TIMESTAMP NOT NULL DEFAULT now()
|
||||
DISTRIBUTED BY (airplane_code)
|
||||
```
|
||||
|
||||
> **Примечание о нормализации JSON**: Источник (`bookings.aircrafts_data`) хранит
|
||||
> поле `model` как JSON-объект `{"en": "...", "ru": "..."}`. На уровне ODS
|
||||
> извлекается только русский вариант (`->>'ru'`) для консистентности с `airports`.
|
||||
|
||||
#### `ods.routes`
|
||||
```sql
|
||||
route_no TEXT NOT NULL
|
||||
|
||||
Reference in New Issue
Block a user