From fb29b369f6c3203b21d57f11050835d3bcfc74c4 Mon Sep 17 00:00:00 2001 From: mnoskov Date: Thu, 14 May 2026 13:13:47 +0300 Subject: [PATCH] =?UTF-8?q?=D0=9F=D1=80=D0=B0=D0=BA=D1=82=D0=B8=D0=BA?= =?UTF-8?q?=D0=B0=20'=D0=A2=D0=B8=D0=BF=D1=8B=20=D0=B4=D0=B0=D0=BD=D0=BD?= =?UTF-8?q?=D1=8B=D1=85'=20-=20ClickHouse?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../1. Семейство MergeTree}/practice_table_types.sql | 2 +- .../practice_view_and_distribute_engines.sql | 10 +- .../2. Типы данных/practice_data_types.sql | 111 ++++++++++++++++++ 3 files changed, 117 insertions(+), 6 deletions(-) rename mnoskov/clickhouse/практика clickhouse/{Семейство MergeTree => 1. Движки/1. Семейство MergeTree}/practice_table_types.sql (99%) rename mnoskov/clickhouse/практика clickhouse/{ => 1. Движки}/practice_view_and_distribute_engines.sql (90%) create mode 100644 mnoskov/clickhouse/практика clickhouse/2. Типы данных/practice_data_types.sql diff --git a/mnoskov/clickhouse/практика clickhouse/Семейство MergeTree/practice_table_types.sql b/mnoskov/clickhouse/практика clickhouse/1. Движки/1. Семейство MergeTree/practice_table_types.sql similarity index 99% rename from mnoskov/clickhouse/практика clickhouse/Семейство MergeTree/practice_table_types.sql rename to mnoskov/clickhouse/практика clickhouse/1. Движки/1. Семейство MergeTree/practice_table_types.sql index eff4e47..6140c2f 100644 --- a/mnoskov/clickhouse/практика clickhouse/Семейство MergeTree/practice_table_types.sql +++ b/mnoskov/clickhouse/практика clickhouse/1. Движки/1. Семейство MergeTree/practice_table_types.sql @@ -34,7 +34,7 @@ ON CLUSTER clickhouse_cluster ) ENGINE = SummingMergeTree PARTITION BY toYYYYMM(date) -ORDER BY (region, date) +ORDER BY (region, date); INSERT INTO mnoskov.region_sales (region, date, sales) VALUES diff --git a/mnoskov/clickhouse/практика clickhouse/practice_view_and_distribute_engines.sql b/mnoskov/clickhouse/практика clickhouse/1. Движки/practice_view_and_distribute_engines.sql similarity index 90% rename from mnoskov/clickhouse/практика clickhouse/practice_view_and_distribute_engines.sql rename to mnoskov/clickhouse/практика clickhouse/1. Движки/practice_view_and_distribute_engines.sql index 0c3d9ee..67eacc4 100644 --- a/mnoskov/clickhouse/практика clickhouse/practice_view_and_distribute_engines.sql +++ b/mnoskov/clickhouse/практика clickhouse/1. Движки/practice_view_and_distribute_engines.sql @@ -38,7 +38,7 @@ ENGINE = ReplicatedMergeTree( ) ORDER BY (ts, user_id); -CREATE VIEW top_active_users AS +CREATE VIEW mnoskov.top_active_users AS SELECT user_id, count(*) AS cnt_user @@ -56,7 +56,7 @@ LIMIT 100; -- тут вообще жопа какая-то. Если смотреть на пример создания MV, то выдает ошибку мол engine указывать нельзя. Полез в документацию, там сказано что после указания имени mv нужно добавлять TO ... но все равно выдется ошибка. -- этот способ я в хабре нашел -CREATE TABLE raw_events +CREATE TABLE mnoskov.raw_events ( event_time DateTime, user_id UInt32, @@ -65,7 +65,7 @@ CREATE TABLE raw_events ENGINE = MergeTree ORDER BY (event_time, user_id); -CREATE TABLE agr_clicks_per_day +CREATE TABLE mnoskov.agr_clicks_per_day ON CLUSTER clickhouse_cluster ( event_date Date, @@ -74,7 +74,7 @@ ON CLUSTER clickhouse_cluster ENGINE = MergeTree ORDER BY event_date; -CREATE MATERIALIZED VIEW mv_clicks_per_day TO agr_clicks_per_day AS +CREATE MATERIALIZED VIEW mnoskov.mv_clicks_per_day TO mnosokv.agr_clicks_per_day AS SELECT toDate(event_time) AS event_date, count(*) AS count @@ -83,5 +83,5 @@ FROM GROUP BY event_date; -SELECT * FROM agr_clicks_per_day; +SELECT * FROM mnoskov.agr_clicks_per_day; -- ничего у меня получилось, и с SummingMergeTree ни с MergeTree. Как очень непонятно материализованные таблицы работают. Если делать как в теории в инфре, то тоже ничего не работает. \ No newline at end of file diff --git a/mnoskov/clickhouse/практика clickhouse/2. Типы данных/practice_data_types.sql b/mnoskov/clickhouse/практика clickhouse/2. Типы данных/practice_data_types.sql new file mode 100644 index 0000000..a92fb71 --- /dev/null +++ b/mnoskov/clickhouse/практика clickhouse/2. Типы данных/practice_data_types.sql @@ -0,0 +1,111 @@ +-- Задание 1 + +CREATE TABLE mnoskov.raw_data1 +ON CLUSTER clickhouse_cluster ( + user_id String, + balance String, + created_at String +) +ENGINE = ReplicatedMergeTree( + '/clickhouse/tables/{shard}/mnoskov/raw_data1', + '{replica}' +) +ORDER BY tuple(); + +SELECT + user_id, + toDecimal64OrNull(balance,2) AS balance, + toDateTime64OrNull(created_at, 3) AS created_at +FROM + mnoskov.raw_data1 +WHERE + balance IS NOT NULL AND created_at IS NOT NULL; + + +-- Задание 2 + +CREATE TABLE events +ON CLUSTER clickhouse_cluster ( + event_id String, + event_date String, -- форматы: "2023-01-01", "01.02.2023", "invalid" + event_time String -- форматы: "12:30:45", "25:99:99" +) +ENGINE = ReplicatedMergeTree( + '/clickhouse/tables/{shard}/mnoskov/events', + '{replica}' +) +ORDER BY + event_id; + +SELECT * FROM mnoskov.events; + + +SELECT + event_id, + toDate(parseDateTimeBestEffortOrNull(event_date)) AS event_dates, + CASE + WHEN toDayOfMonth(parseDateTimeBestEffortOrNull(event_time)) = 1 THEN toHour(parseDateTimeBestEffortOrNull(event_time)) + ELSE (toDayOfMonth(parseDateTimeBestEffortOrNull(event_time)) - 1) * 24 + toHour(parseDateTimeBestEffortOrNull(event_time)) + END AS event_times, + toDateTime(parseDateTimeBestEffortOrNull(event_date)) + toIntervalHour(event_times) AS event_datetime +FROM + mnoskov.events +ORDER BY + event_dates; +-- Все преобразования с to... и parse... нашел тут https://clickhouse.com/docs/ru/sql-reference/functions/type-conversion-functions#toIntervalMonth. +-- explain analyze не работает, потэому не могу посмотреть насколько это эффективно, НО главное сам запрос работает. + + +-- Задание 3 + +CREATE TABLE mnoskov.user_activity +ON CLUSTER clickhouse_cluster +( + user_id UInt32, + actions String -- JSON: ["login", "purchase", "logout"] +) +ENGINE = ReplicatedMergeTree( + '/clickhouse/tables/{shard}/mnoskov/user_activity', + '{replica}' +) +ORDER BY + user_id; + +SELECT + user_id, + count(*) +FROM + mnoskov.user_activity +WHERE + has(JSONExtract(actions, 'Array(String)'), 'purchase') +GROUP BY + user_id +ORDER BY + user_id; + + +-- Задание 4 + +CREATE TABLE mnoskov.sensor_data +ON CLUSTER clickhouse_cluster +( + sensor_id UInt32, + value Float64, + status Enum('ok' = 1, 'error' = 2) +) +ENGINE = ReplicatedMergeTree( + '/clickhouse/tables/{shard}/mnoskov/sensor_data', + '{replica}' +) +ORDER BY sensor_id; + +--1-2. +SELECT + toString(status) AS str_status, + avg(value) AS avg_value +FROM + mnoskov.sensor_data +GROUP BY + str_status; +--3 +-- не понял задание. все строки в value можно преобразовать в Decimal(10,2), потому что value - Float64, а он все null переделывает в 0. \ No newline at end of file