Зачем моделировать данные, если Snowflake всё обработает сам? Разбираемся на примере.
🔸 Задача
Проанализировать элементы, которые пользователи видят в списке (товары, результаты поиска, посты в ленте).
Аналитикам нужно:
- Оценить CTR
- Определить влияние позиции (1-я vs 10-я)
🔸Современный стек данных
Этап 1: Сбор данных
Фронтенд отправляет JSON-событие:
{
"user_id": 3299223,
"event_time": "2022-04-21 12:31:55 UTC",
"items_shown": [1037287139, 1727228887, ..., 1665899805]
}Этап 2: Доставка
API → Kafka/Airbyte/Fivetran → Snowflake → таблица
RAW_EventsЭтап 3: Готово!
Преимущества:
- Не нужно думать о масштабируемости
- Не нужно преобразовывать данные
- JSON работает из коробки
🔸 Анализ без моделирования
Запрос 1: Развернуть массив
SELECT
user_id,
value::NUMBER as item_id,
index as position
FROM RAW_Events,
LATERAL FLATTEN(input => items_shown)
Запрос 2: Сколько пользователей видели item на позиции 1?
SELECT COUNT(DISTINCT user_id)
FROM (
SELECT user_id, value, index
FROM RAW_Events,
LATERAL FLATTEN(input => items_shown)
)
WHERE value = 1037287139
AND index = 0
AND DATE(event_time) = CURRENT_DATE
🔸 Проблемы:
- Сложный синтаксис
- Читает ВСЕ JSON из таблицы
- Распаковывает и разворачивает каждый раз
- Медленно и дорого
- При JOIN'ах всё повторяется
🔸 Решение: моделирование
Создаём таблицу Events:
CREATE TABLE Events AS
SELECT
user_id,
event_time,
value::NUMBER as item_id,
index as position
FROM RAW_Events,
LATERAL FLATTEN(input => items_shown)
Обновляем инкрементально (ежедневно/ежечасно).
Запрос 4: Тот же вопрос, но проще
SELECT COUNT(DISTINCT user_id)
FROM Events
WHERE item_id = 1037287139
AND position = 0
AND DATE(event_time) = CURRENT_DATE
🔸 Результаты (20M JSON)
Запрос 2 (без модели) | 47 сек | X-Small |
Запрос 4 (с моделью) | 0.5 сек | X-Small |
Разница: 94x быстрее!
При миллиардах JSON разница в 1000+ раз по времени и деньгам.
🔸 Когда нужно моделирование?
1. Данные достаточно большие
2. Запросы достаточно частые
3. Количество аналитиков ограничено
4. Нужна консистентность результатов
🔸 Итог
10-20 лет назад: аналитик не мог работать с сотнями миллионов строк без инженера данных.
Сегодня: современный стек позволяет исследовать данные самостоятельно. Моделирование не обязательно, но:
- Ускоряет запросы
- Упрощает SQL
- Снижает затраты
- Повышает производительность
Современный стек даёт свободу. Моделирование даёт скорость.
📎 Статья
🎙 Новости
📝 База вопросов
