Работа над ошибками по: 'Типы таблиц', 'View и Distribute движки'.

This commit is contained in:
mnoskov
2026-05-17 17:18:10 +03:00
parent fb29b369f6
commit 21aa48c237
2 changed files with 33 additions and 30 deletions
@@ -18,9 +18,9 @@ ENGINE = Distributed(
'clickhouse_cluster', 'clickhouse_cluster',
'mnoskov', 'mnoskov',
'logs', 'logs',
rand() user_id
); );
-- параметр rand() - это ключ распределния как я понял. Если стоит он, то распределяются данные случайно, если укащать колонку, то по колонке. -- параметр rand() - это ключ распределния между шардами. Если стоит он, то распределяются данные случайно, если укащать колонку, то по колонке.
-- Задание 2 -- Задание 2
@@ -54,16 +54,15 @@ LIMIT 100;
-- Задание 3 -- Задание 3
-- тут вообще жопа какая-то. Если смотреть на пример создания MV, то выдает ошибку мол engine указывать нельзя. Полез в документацию, там сказано что после указания имени mv нужно добавлять TO ... но все равно выдется ошибка.
-- этот способ я в хабре нашел
CREATE TABLE mnoskov.raw_events CREATE TABLE mnoskov.raw_events
ON CLUSTER clickhouse_cluster
( (
event_time DateTime, event_time DateTime,
user_id UInt32, user_id UInt32,
event_type String event_type String
) )
ENGINE = MergeTree ENGINE=MergeTree
ORDER BY (event_time, user_id); ORDER BY(event_time,user_id);
CREATE TABLE mnoskov.agr_clicks_per_day CREATE TABLE mnoskov.agr_clicks_per_day
ON CLUSTER clickhouse_cluster ON CLUSTER clickhouse_cluster
@@ -71,17 +70,17 @@ ON CLUSTER clickhouse_cluster
event_date Date, event_date Date,
count UInt64 count UInt64
) )
ENGINE = MergeTree ENGINE=SummingMergeTree
ORDER BY event_date; ORDER BY event_date;
CREATE MATERIALIZED VIEW mnoskov.mv_clicks_per_day TO mnosokv.agr_clicks_per_day AS CREATE MATERIALIZED VIEW mnoskov.mv_clicks_per_day
ON CLUSTER clickhouse_cluster
TO mnoskov.agr_clicks_per_day AS
SELECT SELECT
toDate(event_time) AS event_date, toDate(event_time) AS event_date,
count(*) AS count count(*) AS count
FROM FROM mnoskov.raw_events
mnoskov.raw_events GROUP BY event_date;
GROUP BY
event_date;
SELECT * FROM mnoskov.raw_events;
SELECT * FROM mnoskov.agr_clicks_per_day; SELECT * FROM mnoskov.agr_clicks_per_day;
-- ничего у меня получилось, и с SummingMergeTree ни с MergeTree. Как очень непонятно материализованные таблицы работают. Если делать как в теории в инфре, то тоже ничего не работает.
@@ -13,18 +13,24 @@ ENGINE = ReplicatedMergeTree(
ORDER BY tuple(); ORDER BY tuple();
SELECT SELECT
user_id,
balance,
created_at
FROM (
SELECT
user_id, user_id,
toDecimal64OrNull(balance,2) AS balance, toDecimal64OrNull(balance,2) AS balance,
toDateTime64OrNull(created_at, 3) AS created_at toDateTime64OrNull(created_at, 3) AS created_at
FROM FROM
mnoskov.raw_data1 mnoskov.raw_data1
)
WHERE WHERE
balance IS NOT NULL AND created_at IS NOT NULL; balance IS NOT NULL AND created_at IS NOT NULL;
-- Задание 2 -- Задание 2
CREATE TABLE events CREATE TABLE mnoskov.events
ON CLUSTER clickhouse_cluster ( ON CLUSTER clickhouse_cluster (
event_id String, event_id String,
event_date String, -- форматы: "2023-01-01", "01.02.2023", "invalid" event_date String, -- форматы: "2023-01-01", "01.02.2023", "invalid"
@@ -42,18 +48,16 @@ SELECT * FROM mnoskov.events;
SELECT SELECT
event_id, event_id,
toDate(parseDateTimeBestEffortOrNull(event_date)) AS event_dates, event_datetime
CASE FROM (
WHEN toDayOfMonth(parseDateTimeBestEffortOrNull(event_time)) = 1 THEN toHour(parseDateTimeBestEffortOrNull(event_time)) SELECT
ELSE (toDayOfMonth(parseDateTimeBestEffortOrNull(event_time)) - 1) * 24 + toHour(parseDateTimeBestEffortOrNull(event_time)) event_id,
END AS event_times, parseDateTimeBestEffortOrNull(concat(event_date, ' ', event_time)) AS event_datetime
toDateTime(parseDateTimeBestEffortOrNull(event_date)) + toIntervalHour(event_times) AS event_datetime FROM
FROM
mnoskov.events mnoskov.events
)
ORDER BY ORDER BY
event_dates; event_datetime;
-- Все преобразования с to... и parse... нашел тут https://clickhouse.com/docs/ru/sql-reference/functions/type-conversion-functions#toIntervalMonth.
-- explain analyze не работает, потэому не могу посмотреть насколько это эффективно, НО главное сам запрос работает.
-- Задание 3 -- Задание 3
@@ -73,7 +77,7 @@ ORDER BY
SELECT SELECT
user_id, user_id,
count(*) count(*) as user_actions_cnt
FROM FROM
mnoskov.user_activity mnoskov.user_activity
WHERE WHERE