Files
homework/dmedvedev/clickhouse/2.CH_view_distribute_engine.sql

103 lines
3.0 KiB
SQL
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# Задачи на отработку:
### **Задача 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;