tgoop.com/data_engineerette/393
Create:
Last Update:
Last Update:
CollapsingMergeTree
Прохожу бесплатный курс по кх "Managed Service for ClickHouse". Дошла до модуля 2 про виды движков, и меня настигло озарение
Вот есть движок CollapsingMergeTree - он сворачивает пары строк, у которых в ключе сортировки одинаковые значения, но при этом поле sign у одной из них равно 1, а у другой -1. Без паники!
CREATE TABLE user_activity (
UserID UInt64, --есть пользак
PageViews UInt8, --он посетил столько страниц
Sign Int8 --системное поле
)
ENGINE = CollapsingMergeTree(Sign)
ORDER BY UserID; --будем сворачивать по этому полю
Наш пользак 999 захотел что-то купить:
INSERT INTO user_activity VALUES (999, 10, 1); --сначала просмотрел 10 страниц
INSERT INTO user_activity VALUES (999, 10, -1), --а теперь 10 страниц уже неактуальны (видите -1?)
(999, 11, 1); --потому что он просмотрел 11 страниц
Т.е. тут явно видно, что update = delete + insert, где sign - это флажок удаления
Но есть нюанс - теперь в нашей таблице 3 строки, а нужна 1. Почему 3, ведь CollapsingMergeTree как раз и должен сам все объединить?
Потому что кх свои слияния производит не сразу, а когда-то потом. Но есть несколько способов получить то, что нужно:
1. FINAL - как будто слияние уже произошло
SELECT * FROM user_activity FINAL;
2. OPTIMIZE - заставляем сделать слияние прямо сейчас. Но у вас может не быть прав на это в продовой базе
OPTIMIZE TABLE user_activity;
SELECT * FROM user_activity; --FINAL уже не нужен
3. Посчитать самим
SELECT UserID, sum(PageViews * Sign)
FROM user_activity
group by UserID;
А ведь действительно 10*1 + 10*(-1) + 11*1 дает то, что нужно…