исправлены предыдущие ошибки, добавлен полностью блок по кликхаус и пет-проект

This commit is contained in:
Dmitry Medvedev
2026-09-15 15:34:46 +05:00
parent 297df348c1
commit fb0f37912d
11 changed files with 1235 additions and 2 deletions
@@ -0,0 +1,102 @@
# Задачи на отработку:
### **Задача 1.**
На каждой ноде(узел) есть таблица logs, в которой пишутся события.
CREATE TABLE logs (
dt DateTime,
user_id UInt32,
event_type String
) ENGINE = MergeTree
ORDER BY dt;
1. Создай распределённую таблицу dist_logs поверх logs с помощью ENGINE = Distributed.
CREATE TABLE dist_logs ON CLUSTER clickhouse_cluster
ENGINE = Distributed(
'clickhouse_cluster',
'dmedvedev',
'logs',
rand()
);
2. Объясни, зачем нужен параметр rand() в Distributed(...).
ЭТО КЛЮЧ ШАРДИРОВАНИЯ, ОН ПОЗВОЛЯЕТ РАСПРЕДЕЛИТЬ ДАННЫЕ РАНДОМНО И РАВНОМЕРНО ПО РАЗЛИЧНЫМ СЕРВЕРАМ.
### **Задача 2.**
Есть таблица events(user_id, event_type, ts)
CREATE TABLE events
(
user_id UInt32,
event_type String,
ts DateTime
)
ENGINE = MergeTree
ORDER BY (ts, user_id);
1. Создай VIEW top_active_users, который показывает топ-100 пользователей по числу событий.
CREATE VIEW top_active_users AS
SELECT
user_id,
COUNT(*) AS total_logs_user
FROM events
GROUP BY user_id
ORDER BY total_logs_user DESC
LIMIT 100;
2. Объясни, почему VIEW не подходит, если нам нужно часто показывать это в дашборде с миллионами строк.
ПОТОМУ ЧТО ПРЕДСТАВЛЕНИЮ VIEW НЕ ОБЛАДАЕТ СВОЙСТВОМ ХРАНЕНИЯ ИНФОРМАЦИИ, ПОСТОЯННО БУДУТ ПРОИСХОДИТЬ ТАКИЕ ПОВТОРНЫЕ ЗАПРОСЫЫ,
КОТОРЫЕ БУДУТ ЗАСОРЯТЬ ПАМЯТЬ, ДЛЯ ТАКИХ ЗАДАЧ МОЖЕТ БЫТЬ ИСПОЛЬЗОВАНО МАТЕРИАЛИЗОВАННОЕ ПРЕДСТАВЛЕНИЕ.
### **Задача 3.**
Таблица raw_events содержит "сырые" клики по сайту.
CREATE TABLE raw_events
(
event_time DateTime,
user_id UInt32,
event_type String
)
ENGINE = MergeTree
ORDER BY (event_time, user_id);
1. Создай Materialized View mv_clicks_per_day, который считает число кликов по дням.
CREATE MATERIALIZED VIEW mv_clicks_per_day
ENGINE = SummingMergeTree
ORDER BY = user_id
AS
SELECT
toDate(event_time) AS DAY,
count(*) AS count_of_enent
FROM raw_events;
2. В движке используй SummingMergeTree, а исходник — raw_events.
3. Проверь, что при INSERT INTO raw_events данные появляются и в mv_clicks_per_day.
INSERT INTO raw_events (event_time, user_id, event_type)
VALUES
('2026-01-01', 1, 'abc'),
('2026-02-01', 2, 'hdf'),
('2026-02-03', 3, 'hhj'),
('2026-03-04', 4, 'sdf'),
('2026-01-01', 5, 'gf');
CREATE MATERIALIZED VIEW mv_clicks_per_day
ENGINE = SummingMergeTree
ORDER BY (DAY)
AS
SELECT
toDate(event_time) AS DAY,
toUInt64(1) AS count_of_event
FROM raw_events
GROUP BY DAY;