Можно ли удалить старые записи из таблицы clickhouse?

Насколько мне известно, clickhouse позволяет вставлять только новые данные. Но можно ли удалить блок старше некоторого периода, чтобы избежать переполнения жесткого диска?


person Stepan Yakovenko    schedule 16.09.2018    source источник
comment
для автоматического удаления старых записей рассмотрите возможность использования TTL -особенность CH   -  person vladimir    schedule 24.04.2020


Ответы (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/

person simPod    schedule 23.10.2018
comment
Вместо delete where 1=1, который добавляет мутацию, я использовал TRUNCATE TABLE <table>, который синхронно удаляет все данные из таблицы без добавления мутации. - person Tez; 03.02.2021
comment
@Tez спасибо, я обновил ответ - person simPod; 10.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 
person Dipesh Maurya    schedule 17.10.2018

Clickhouse не имеет функции обновления / удаления, такой как база данных Mysql. Но мы все еще можем выполнить удаление, организовав данные в разделе. Я не знаю, как вы управляете данными, поэтому я беру здесь пример, например, когда данные хранятся в разделах по месяцам.

Используя команду "DROP PARTITION", вы можете удалить данные за этот месяц, отбросив раздел этого месяца, вот полное объяснение того, как удалить раздел https://clickhouse.yandex/blog/en/how-to-update-data-in-clickhouse.

person Shishir Mudliyar    schedule 05.10.2018