Хранилище данных по medallion-архитектуре
Пять публичных источников, ни один из которых не согласуется с другими, загружены в Microsoft Fabric и очищены через bronze, silver и gold до звёздной схемы, к которой Power BI обращается без подзапросов.

Пять источников, которые ни в чём не сходятся
Хранилище тянет данные из пяти реальных публичных источников, специально выбранных так, чтобы они не совпадали:
- NYC Taxi and Limousine Commission — месячные файлы Parquet по HTTPS
- OpenAQ — постраничный JSON с замерами качества воздуха
- World Bank — JSON с ВВП по странам и годам
- European Central Bank — CSV с курсом USD к EUR
- Open-Meteo — JSON с температурой, осадками, ветром и влажностью
Разные форматы, разная гранулярность, разные представления о том, что такое дата. Данные такси приходят по поездкам, качество воздуха — по замерам, ВВП — раз в год. Свести их в одну модель и есть вся задача.
Bronze молчит
Слой bronze хранит файлы ровно такими, какими они пришли: Parquet, JSON и CSV — в bronze/nyc_taxi/, bronze/air_quality/, bronze/economy/ и bronze/weather/. Никаких преобразований вообще.
Эта сдержанность и есть смысл слоя. Когда через три недели число выглядит неправильно, bronze — единственное место, которое может ответить, прислал его таким источник или его таким сделало преобразование. Слой, который «слегка причёсывает» данные на входе, уничтожает улики.
Приём данных сделан по-разному намеренно, под каждый источник, а не через один механизм: Pipeline для файлов такси, Dataflow Gen2 для OpenAQ, курса ЕЦБ и ВВП Всемирного банка, и Notebook для погоды.
Silver спорит
Silver — это таблицы Delta, которые загружают ноутбуки PySpark полной загрузкой с truncate и insert. Здесь происходят очистка, стандартизация, нормализация и расчёт производных колонок; на выходе — nyc_taxi_silver, openaq_silver, ecb_fx_silver, world_gdp_silver и weather_silver.
Полная загрузка вместо инкрементальной была верным решением на этом объёме. Инкрементальная загрузка покупает скорость ценой ошибок корректности, а объём здесь в скорости не нуждался.
Gold смоделирован под чтение
!Звёздная схема: три ежедневные таблицы фактов в окружении измерений даты, зоны, курса и ВВП
Три таблицы фактов, все с дневной гранулярностью: facttaxidaily, factairqualitydaily и factweatherdaily. Вокруг них четыре измерения: dimdate, dimzone, dimfx и dimgdp.
Два решения в модели, которые стоит назвать:
- Всё приведено к дневной гранулярности. Поездки такси и замеры воздуха
- У `dimgdp` нет внешнего ключа. ВВП годовой и на уровне страны, поэтому
dimdate несёт year, month, day, month_name, day_name, day_of_week, quarter и is_weekend, чтобы отчёт фильтровал по колонке, а не разбирал строку во время запроса.
Три выхода
Слой gold питает трёх потребителей — это неплохая проверка того, насколько хорошо он смоделирован:
- Power BI — пять страниц отчёта, построенных прямо на gold.
- InfluxDB — для временных рядов погоды. Cron в 07:00 запускает
- Telegram-бот с командой
/check_quality, который по запросу отдаёт отчёты
Последний важнее, чем кажется. Отчёты о качестве данных, живущие в ноутбуке, читают один раз. Отчёт, который можно запросить с телефона, читают тогда, когда что-то выглядит странно — а это единственный момент, когда он и нужен.