- Зачем: - преобразования хранилища должны читаться рядом с целевым слоем, а DAG должен показывать оркестрацию. - Что: - запросы забора и разбора заказов разложены по каталогам STG и ODS. - общий контракт провода подключён в обе ветви штатным шаблонизатором Airflow. - SQL смонтирован во все службы Airflow, а правило раскладки записано в архитектуре. - Проверка: - make lint config-test smoke check-services. - airflow tasks render для pull_batch и parse_batch; airflow tasks test для parse_batch.
34 lines
2.0 KiB
SQL
34 lines
2.0 KiB
SQL
-- Годные версии заказа. Срез читается по _load_id — тому же, что проставил
|
|
-- забор: разбор идёт по неизменной порции, а не по «всему, что появилось».
|
|
--
|
|
-- Разобранные значения берёт assumeNotNull: обнуляемый разбор стоит за
|
|
-- предикатом, который NULL уже отсёк, и приведение здесь не может упасть.
|
|
|
|
INSERT INTO ods.order_snapshot_dist
|
|
{% include "ods/_order_wire_contract.sql" %}
|
|
SELECT
|
|
JSONExtractString(raw, 'order_id') AS order_id,
|
|
JSONExtract(raw, 'user_id', 'UInt64') AS user_id,
|
|
JSONExtractString(raw, 'status') AS status,
|
|
assumeNotNull(parseDateTime64InJodaSyntaxOrNull(
|
|
JSONExtractString(raw, 'created_at'), ts_mask, 'UTC')) AS created_at,
|
|
assumeNotNull(parseDateTime64InJodaSyntaxOrNull(
|
|
JSONExtractString(raw, 'updated_at'), ts_mask, 'UTC')) AS updated_at,
|
|
assumeNotNull(toDecimal64OrNull(
|
|
JSONExtractString(raw, 'items_total'), 2)) AS items_total,
|
|
assumeNotNull(toDecimal64OrNull(JSONExtractString(raw, 'discount'), 2)) AS discount,
|
|
assumeNotNull(toDecimal64OrNull(JSONExtractString(raw, 'delivery'), 2)) AS delivery,
|
|
assumeNotNull(toDecimal64OrNull(JSONExtractString(raw, 'total'), 2)) AS total,
|
|
-- items кладётся сырым фрагментом JSON, а не разобранной структурой.
|
|
JSONExtractRaw(raw, 'items') AS items,
|
|
toDate(assumeNotNull(parseDateTimeInJodaSyntaxOrNull(
|
|
JSONExtractString(raw, 'snapshot_date'),
|
|
'yyyy-MM-dd', 'UTC'))) AS snapshot_date,
|
|
-- Метки запуска и прибытия переносятся как есть. Поставь здесь now64(3) —
|
|
-- и _load_ts молча ответила бы на другой вопрос: «когда разобрали».
|
|
_load_id,
|
|
_load_ts
|
|
FROM stg.orders_raw_dist
|
|
WHERE _load_id = {load_id:String} AND row_is_valid
|
|
SETTINGS distributed_foreground_insert = 1
|