Практика 'Типы данных' - ClickHouse

This commit is contained in:
mnoskov
2026-05-14 13:13:47 +03:00
parent 318c50b563
commit fb29b369f6
3 changed files with 117 additions and 6 deletions
@@ -34,7 +34,7 @@ ON CLUSTER clickhouse_cluster
) )
ENGINE = SummingMergeTree ENGINE = SummingMergeTree
PARTITION BY toYYYYMM(date) PARTITION BY toYYYYMM(date)
ORDER BY (region, date) ORDER BY (region, date);
INSERT INTO mnoskov.region_sales (region, date, sales) INSERT INTO mnoskov.region_sales (region, date, sales)
VALUES VALUES
@@ -38,7 +38,7 @@ ENGINE = ReplicatedMergeTree(
) )
ORDER BY (ts, user_id); ORDER BY (ts, user_id);
CREATE VIEW top_active_users AS CREATE VIEW mnoskov.top_active_users AS
SELECT SELECT
user_id, user_id,
count(*) AS cnt_user count(*) AS cnt_user
@@ -56,7 +56,7 @@ LIMIT 100;
-- тут вообще жопа какая-то. Если смотреть на пример создания MV, то выдает ошибку мол engine указывать нельзя. Полез в документацию, там сказано что после указания имени mv нужно добавлять TO ... но все равно выдется ошибка. -- тут вообще жопа какая-то. Если смотреть на пример создания MV, то выдает ошибку мол engine указывать нельзя. Полез в документацию, там сказано что после указания имени mv нужно добавлять TO ... но все равно выдется ошибка.
-- этот способ я в хабре нашел -- этот способ я в хабре нашел
CREATE TABLE raw_events CREATE TABLE mnoskov.raw_events
( (
event_time DateTime, event_time DateTime,
user_id UInt32, user_id UInt32,
@@ -65,7 +65,7 @@ CREATE TABLE raw_events
ENGINE = MergeTree ENGINE = MergeTree
ORDER BY (event_time, user_id); ORDER BY (event_time, user_id);
CREATE TABLE agr_clicks_per_day CREATE TABLE mnoskov.agr_clicks_per_day
ON CLUSTER clickhouse_cluster ON CLUSTER clickhouse_cluster
( (
event_date Date, event_date Date,
@@ -74,7 +74,7 @@ ON CLUSTER clickhouse_cluster
ENGINE = MergeTree ENGINE = MergeTree
ORDER BY event_date; 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 SELECT
toDate(event_time) AS event_date, toDate(event_time) AS event_date,
count(*) AS count count(*) AS count
@@ -83,5 +83,5 @@ FROM
GROUP BY GROUP BY
event_date; event_date;
SELECT * FROM agr_clicks_per_day; SELECT * FROM mnoskov.agr_clicks_per_day;
-- ничего у меня получилось, и с SummingMergeTree ни с MergeTree. Как очень непонятно материализованные таблицы работают. Если делать как в теории в инфре, то тоже ничего не работает. -- ничего у меня получилось, и с SummingMergeTree ни с MergeTree. Как очень непонятно материализованные таблицы работают. Если делать как в теории в инфре, то тоже ничего не работает.
@@ -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.