Skip to content

Comments

Изменяю структуру CH, под трендовые фильмы#192

Merged
taaylor merged 2 commits intomainfrom
feature/film-trends-ch
Jul 31, 2025
Merged

Изменяю структуру CH, под трендовые фильмы#192
taaylor merged 2 commits intomainfrom
feature/film-trends-ch

Conversation

@taaylor
Copy link
Owner

@taaylor taaylor commented Jul 31, 2025

Более подробно с AggregatingMergeTree можно ознакомится в статье: https://habr.com/ru/articles/736518/
Только автор упоминает в статье использование локальных таблиц для матвью, не дистрибутивный (такой подход у меня не работал, данные неправильно распределялись на кластере, по итогу реализовал через дистрибутивные и все кайф летает)
Материализованное представление (materialized view) (матвью) в ClickHouse — это предварительно вычисленная структура данных, которая хранит результаты запроса SELECT. В отличие от обычного представления (VIEW), которое вычисляется при каждом обращении к нему, материализованное представление сохраняет данные физически после выполнения запроса и обновляется, как правило, при добавлении новых данных в исходную таблицу.

Тестирование:

  • выполнить команду: make up-metrics-service - запустится весь сервис метрик
  • дождаться когда все поднимется
  • из корня проекта выполнить скрипт: python3.12 backup/clickhouse_init_struct/generate_event.py - тут я хотел понять что такое многопоточность, локеры, семафоры поэтому набросал такой скрипт. Он выполняет 1000 запросов в многопоточном режиме в сервис метрик, после чего перекладывается вся логика на etl.
  • Далее заходим в DBeaver и глядим таблицу metrics_dist там будут все наши события сгенерированные
  • Таблица trends_raw_data_dist - содержит уже перобразованые сырые данные из таблицы metrics_dist под тренды которая проставляет оценки событиям
  • Таблица trends_arggr_data_dist - неявно хранит агрегированные данные которая как раз таки группирует все события по определенным фильмам и дате.
  • Между как раз таки всеми новыми таблицами протекает матвью - можно считать ее как некий etl между таблицами которая при добавлении новых значений стягивает необходимые данные из одной и переписывает в другую.
  • Ну и в конце нужно выполнить запрос, чтобы получить топ недельных фильмов:
SELECT
    film_uuid,
    sumMerge(total_score) AS total_score
FROM kinoservice.trends_arggr_data
WHERE event_date >= now() - INTERVAL 7 DAY
GROUP BY film_uuid
ORDER BY total_score DESC
LIMIT 10;

Copy link
Collaborator

@Potatoes3212 Potatoes3212 left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Всё кайф. Про симофоры и треды интересно.

self.task_queue.put((url, payload))

def _send_request_post(self, url: str, payload: dict | None = None) -> dict[str, Any]:
requests.post(url, json=payload)
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Недочёт: метод ничего не возвращает, а аннотация обещает dict[str, Any]

Copy link
Collaborator

@Kirill67tyar Kirill67tyar left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Крутая логика с запросами, буду ещё разбираться!

def create_task(self, url: str, payload: dict | None = None) -> None:
self.task_queue.put((url, payload))

def _send_request_post(self, url: str, payload: dict | None = None) -> dict[str, Any]:
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Можно сделать staticmethod, т.к. self внутри метода не используется

@taaylor taaylor merged commit 2d90b06 into main Jul 31, 2025
5 checks passed
@taaylor taaylor deleted the feature/film-trends-ch branch July 31, 2025 21:05
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants