fix(clickhouse): починена проверка словаря, выметены хвосты переноса
Зачем: ревью в три линии нашло настоящий дефект. Девятая проверка кластера
звала dictGet('dds.products', …) — объекта после переноса не существует, и
make check-clickhouse падал. Промах вырос из недосчёта: упоминания dds.products
я искал с фильтром по расширениям, .sh туда не попал, и в ADR уехало «четыре
упоминания» вместо семи.
Что: проверка переведена на dic.products и сверяет цену, умножив её обратно на
сто, — так утверждается ещё и точность приведения к Decimal. Раздел 3
мастер-спеки и список пользователей README догнали перенос: оба описывали
отменённое устройство. В ADR 0012 добавлено условие пересмотра для дома — для
него его не было, хотя ради дома тикет и заводился; недосчёт записан в
«Что проверено» как урок. Разнобой обозначений сведён: карта таблиц в доке
хранилища перешла на имена баз строчными, таблица мастер-спеки — на заголовок
«Где», зону всюду зовут зоной, а не слоем. Термин «Справочник» переписан без
метафоры и уложен в формат глоссария. Вычтено лишнее: комментарии DDL
сократились вдвое, из ADR 0006 и 0007 убраны самооправдание и дублирующие
абзацы, отраслевой образец получил честную оговорку о непроверяемости.
Проверка: make config-test, make lint, make smoke и make check-clickhouse —
все зелёные, десять проверок кластера из десяти.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
@@ -431,15 +431,15 @@ kafka_offset)`: смотрят такую таблицу от класса, а
|
||||
|
||||
Первый и пока единственный справочник — каталог товаров: подложка
|
||||
`dic.products_file` над CSV репозитория и словарь `dic.products` поверх неё.
|
||||
Реплик у зоны нет: обе ноды читают свой смонтированный файл и держат свою копию
|
||||
словаря в памяти. Словарь обновляется сам, окном `LIFETIME`, и потому после
|
||||
правки каталога ноды какое-то время отвечают по-разному. Разогнать его раньше
|
||||
срока — `SYSTEM RELOAD DICTIONARY ON CLUSTER`; это административная операция,
|
||||
роль `etl` права на неё не получает.
|
||||
Распределённых пар у зоны нет: обе ноды читают свой смонтированный файл и
|
||||
держат свою копию словаря в памяти. Словарь обновляется сам, окном `LIFETIME`,
|
||||
и потому после правки каталога ноды какое-то время отвечают по-разному.
|
||||
Разогнать его раньше срока — `SYSTEM RELOAD DICTIONARY ON CLUSTER`; это
|
||||
административная операция, роль `etl` права на неё не получает.
|
||||
|
||||
Деньги каталога стоит держать в голове отдельно от остальных: в CSV лежат целые
|
||||
копейки, словарь отдаёт `Decimal(18, 2)`, а `productPrice` события — уже целые
|
||||
рубли. Разрыв намеренный, на нём стоит урок про `Float64` ([описание
|
||||
Деньги каталога живут в трёх единицах: в CSV — целые копейки, словарь отдаёт
|
||||
`Decimal(18, 2)`, `productPrice` события — целые рубли. Разрыв намеренный, на
|
||||
нём стоит урок про `Float64` ([описание
|
||||
выгрузки](../formats/clickstream-event.md)).
|
||||
|
||||
Устройство обоих объектов — почему такой движок, такая форма пути, такой
|
||||
@@ -525,18 +525,18 @@ Airflow читает и собирает эти файлы штатным шаб
|
||||
|
||||
| База | Объект | Что это |
|
||||
|---|---|---|
|
||||
| STG | `stg.hits_raw_kafka` | чтец топика `hits`, формат `RawBLOB` |
|
||||
| STG | `stg.hits_raw_rep` / `_dist` | сырая строка сообщения плюс метаданные доставки |
|
||||
| STG | `stg.hits_raw_mv` | наполняет сырьё из чтеца |
|
||||
| STG | `stg.orders_raw_kafka` | чтец топика `orders`, формат `RawBLOB`, только на ноде 1 и без матвью |
|
||||
| STG | `stg.orders_raw_rep` / `_dist` | сырое сообщение слепка, метаданные доставки и `_load_id` |
|
||||
| ODS | `ods.event_rep` / `_dist` | типизированное широкое событие |
|
||||
| ODS | `ods.event_v` | актуальная версия события с полями источника |
|
||||
| ODS | `ods.event_errors_rep` / `_dist` | строки, не прошедшие строгий приём |
|
||||
| ODS | `ods.event_mv`, `ods.event_errors_mv` | разбор сырья в событие и в ошибки |
|
||||
| ODS | `ods.order_snapshot_rep` / `_dist` | типизированные версии заказа |
|
||||
| ODS | `ods.order_v` | текущая версия заказа на языке источника |
|
||||
| ODS | `ods.order_snapshot_errors_rep` / `_dist` | строки слепка, не прошедшие строгий приём |
|
||||
| `stg` | `stg.hits_raw_kafka` | чтец топика `hits`, формат `RawBLOB` |
|
||||
| `stg` | `stg.hits_raw_rep` / `_dist` | сырая строка сообщения плюс метаданные доставки |
|
||||
| `stg` | `stg.hits_raw_mv` | наполняет сырьё из чтеца |
|
||||
| `stg` | `stg.orders_raw_kafka` | чтец топика `orders`, формат `RawBLOB`, только на ноде 1 и без матвью |
|
||||
| `stg` | `stg.orders_raw_rep` / `_dist` | сырое сообщение слепка, метаданные доставки и `_load_id` |
|
||||
| `ods` | `ods.event_rep` / `_dist` | типизированное широкое событие |
|
||||
| `ods` | `ods.event_v` | актуальная версия события с полями источника |
|
||||
| `ods` | `ods.event_errors_rep` / `_dist` | строки, не прошедшие строгий приём |
|
||||
| `ods` | `ods.event_mv`, `ods.event_errors_mv` | разбор сырья в событие и в ошибки |
|
||||
| `ods` | `ods.order_snapshot_rep` / `_dist` | типизированные версии заказа |
|
||||
| `ods` | `ods.order_v` | текущая версия заказа на языке источника |
|
||||
| `ods` | `ods.order_snapshot_errors_rep` / `_dist` | строки слепка, не прошедшие строгий приём |
|
||||
| `dic` | `dic.products_file` | чтец CSV-каталога, общего с генератором |
|
||||
| `dic` | `dic.products` | словарь товаров поверх подложки |
|
||||
|
||||
|
||||
Reference in New Issue
Block a user