исправлены предыдущие ошибки, добавлен полностью блок по кликхаус и пет-проект
This commit is contained in:
@@ -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;
|
||||
Reference in New Issue
Block a user