Насколько мне известно, clickhouse позволяет вставлять только новые данные. Но можно ли удалить блок старше некоторого периода, чтобы избежать переполнения жесткого диска?
Можно ли удалить старые записи из таблицы clickhouse?
Ответы (3)
Изменение данных с помощью мутаций
См. Документацию по функции мутаций https://clickhouse.yandex/docs/en/query_language/alter/#mutations.
Функция была реализована в третьем квартале 2018 года.
Удалить данные
ALTER TABLE <table> DELETE WHERE <filter expression>
Грязно удалить все
Всегда нужно указывать выражение фильтра. Если вы хотите удалить все данные через Мутацию, укажите что-нибудь, что всегда верно, например:
ALTER TABLE <table> DELETE WHERE 1=1
Обновить данные
Аналогичным образом можно изменить (UPDATE
)
ALTER TABLE <table> UPDATE column1 = expr1 [, ...] WHERE <filter expression>
Имейте в виду, это асинхронно
Обратите внимание, что все приведенные выше команды не выполняют мутацию данных напрямую (синхронно). Вместо этого они планируют мутацию ClickHouse, которая выполняется независимо (асинхронно) в фоновом режиме. По этой причине был выбран синтаксис ALTER TABLE
вместо типичного SQL _6 _ / _ 7_. Вы можете проверить прогресс незавершенных мутаций через
SELECT *
FROM system.mutations
WHERE is_done = 0
Изменение данных без использования мутаций
Инструкция Theres TRUNCATE TABLE
со следующим синтаксисом:
TRUNCATE TABLE [IF EXISTS] [db.]name [ON CLUSTER cluster]
Это синхронно обрезает таблицу. Он проверит размер таблицы, поэтому не позволит вам удалить, если размер таблицы превышает max_table_size_to_drop
. Смотрите документы здесь:
https://clickhouse.tech/docs/en/sql-reference/statements/truncate/
delete where 1=1
, который добавляет мутацию, я использовал TRUNCATE TABLE <table>
, который синхронно удаляет все данные из таблицы без добавления мутации.
- person Tez; 03.02.2021
Пример создания и удаления раздела
CREATE TABLE test.partitioned_by_month(d Date, x UInt8) ENGINE = MergeTree
PARTITION BY toYYYYMM(d) ORDER BY x;
INSERT INTO test.partitioned_by_month VALUES ('2000-01-01', 1), ('2000-01-02', 2), ('2000-01-03', 3);
INSERT INTO test.partitioned_by_month VALUES ('2000-02-03', 4), ('2000-02-03', 5);
INSERT INTO test.partitioned_by_month VALUES ('2000-03-03', 4), ('2000-03-03', 5);
SELECT * FROM test.partitioned_by_month;
---d------------|-------x-----
2000-02-03 | 4
2000-02-03 | 5
---d------------|-------x-----
2000-03-03 | 4
2000-03-03 | 5
---d------------|-------x-----
2000-01-01 | 1
2000-01-02 | 2
2000-01-03 | 3
ALTER TABLE test.partitioned_by_month DROP PARTITION 200001;
select * from partitioned_by_month;
---d------------|-------x-----
2000-03-03 | 4
2000-03-03 | 5
---d------------|-------x-----
2000-02-03 | 4
2000-02-03 | 5
Clickhouse не имеет функции обновления / удаления, такой как база данных Mysql. Но мы все еще можем выполнить удаление, организовав данные в разделе. Я не знаю, как вы управляете данными, поэтому я беру здесь пример, например, когда данные хранятся в разделах по месяцам.
Используя команду "DROP PARTITION", вы можете удалить данные за этот месяц, отбросив раздел этого месяца, вот полное объяснение того, как удалить раздел https://clickhouse.yandex/blog/en/how-to-update-data-in-clickhouse.