Удаляем дубли в ClickHouse без ReplacingMergeTree
У меня была задачка настроить создание табличек через фреймворк. И вот настал момент - локально все работает, доступ к кх я получила, джобку доделана. Пора тестить!
💻 Сначала я решила покрутить запросы ручками, проверить права на создание табличек, все ли работает. Создаю на движке MergeTree, пишу данные - все ок. Перехожу к ReplicatedMergeTree - создаю табличку, вставляю пару строк данных, делаю select...
CREATE TABLE db.test_table_local ON CLUSTER '{cluster}'
(
`id` UInt32,
`name` String
)
ENGINE = ReplicatedMergeTree
ORDER BY id;
INSERT INTO db.test_table_local
VALUES (1, 'test');
INSERT INTO db.test_table_local
VALUES (1, 'test');
SELECT * FROM db.test_table_local;
Нет, что-то не то. Я вставила 2 строки, но вижу одну. Почему? В табличке всего 2 поля, что пошло не так?
😑 Иду искать проблему. Попробовала вставить еще раз и еще раз, посмотрела в system.parts на незавершенные мутации, сделала SYSTEM SYNC REPLICA, но ничего не помогло
Потом я поняла, что удаляются дубликаты для записей с одним первичным ключом. Но в кх же нет такой строгости? Что-то не сходится
Нахожу в доке по кх:
Для движков *ReplicatedMergeTree дедупликация вставок включена по умолчанию и управляется настройками replicated_deduplication_window и replicated_deduplication_window_seconds. Для нереплицируемых движков *MergeTree дедупликация управляется настройкой non_replicated_deduplication_window.
Иду в табличку смотреть эти настройки:
SELECT * FROM system.merge_tree_settings
WHERE name LIKE '%deduplicat%';
Из основных настроек вижу:
📌non_replicated_deduplication_window = 0, поэтому в MergeTree данные вставляются как обычно
📌replicated_deduplication_window != 0, дубликаты не вставляются, они проверяются по хэш-суммам для определенного количества свежих блоков (по дефолту 10к), хэши лежат в Zookeeper
📌replicated_deduplication_window_seconds - сколько секунд хранятся эти хэш-суммы (по дефолту 3600с = 1ч)
Я со своей задублированной строкой попала сразу в 2 настройки. До этого не замечала такого поведения в кх, хотя это дефолтное🤷♂️ Зато узнала про существование таблицы system.merge_tree_settings
@data_engineerette
У меня была задачка настроить создание табличек через фреймворк. И вот настал момент - локально все работает, доступ к кх я получила, джобку доделана. Пора тестить!
💻 Сначала я решила покрутить запросы ручками, проверить права на создание табличек, все ли работает. Создаю на движке MergeTree, пишу данные - все ок. Перехожу к ReplicatedMergeTree - создаю табличку, вставляю пару строк данных, делаю select...
CREATE TABLE db.test_table_local ON CLUSTER '{cluster}'
(
`id` UInt32,
`name` String
)
ENGINE = ReplicatedMergeTree
ORDER BY id;
INSERT INTO db.test_table_local
VALUES (1, 'test');
INSERT INTO db.test_table_local
VALUES (1, 'test');
SELECT * FROM db.test_table_local;
Нет, что-то не то. Я вставила 2 строки, но вижу одну. Почему? В табличке всего 2 поля, что пошло не так?
😑 Иду искать проблему. Попробовала вставить еще раз и еще раз, посмотрела в system.parts на незавершенные мутации, сделала SYSTEM SYNC REPLICA, но ничего не помогло
Потом я поняла, что удаляются дубликаты для записей с одним первичным ключом. Но в кх же нет такой строгости? Что-то не сходится
Нахожу в доке по кх:
Для движков *ReplicatedMergeTree дедупликация вставок включена по умолчанию и управляется настройками replicated_deduplication_window и replicated_deduplication_window_seconds. Для нереплицируемых движков *MergeTree дедупликация управляется настройкой non_replicated_deduplication_window.
Иду в табличку смотреть эти настройки:
SELECT * FROM system.merge_tree_settings
WHERE name LIKE '%deduplicat%';
Из основных настроек вижу:
📌non_replicated_deduplication_window = 0, поэтому в MergeTree данные вставляются как обычно
📌replicated_deduplication_window != 0, дубликаты не вставляются, они проверяются по хэш-суммам для определенного количества свежих блоков (по дефолту 10к), хэши лежат в Zookeeper
📌replicated_deduplication_window_seconds - сколько секунд хранятся эти хэш-суммы (по дефолту 3600с = 1ч)
Я со своей задублированной строкой попала сразу в 2 настройки. До этого не замечала такого поведения в кх, хотя это дефолтное🤷♂️ Зато узнала про существование таблицы system.merge_tree_settings
@data_engineerette