Clickhouse のドキュメントを調べましたが、UPDATE または DELETE のオプションが表示されませんでした。私には追加のみのシステムのようです。既存のレコードを更新する可能性はありますか、または変更されたレコードを含むパーティションを切り捨て、そのパーティションのデータ全体を再挿入するなどの回避策はありますか?
5 に答える
更新: この答えはもはや真実ではありません。https://stackoverflow.com/a/55298764/3583139を見てください。
ClickHouse は実際の UPDATE/DELETE をサポートしていません。ただし、可能な回避策はほとんどありません。
更新する必要のない方法でデータを整理しようとしています。更新イベントのログをテーブルに書き込み、そのログからレポートを計算できます。したがって、既存のレコードを更新する代わりに、新しいレコードをテーブルに追加します。
マージ中にバックグラウンドでデータ変換を行うテーブル エンジンを使用します。たとえば、(かなり具体的な) CollapsingMergeTree テーブル エンジン: https://clickhouse.yandex/reference_en.html#CollapsingMergeTree また、ReplacingMergeTree テーブル エンジンもあります (まだ文書化されていません。テストで例を見つけることができます: https://github.com/ yandex/ClickHouse/blob/master/dbms/tests/queries/0_stateless/00325_replacing_merge_tree.sql ) 欠点は、バックグラウンド マージがいつ行われるか、いつ行われるかがわからないことです。
samdojの答えも見てください。
新しいテーブルを削除して作成することはできますが、サイズによっては非常に時間がかかる場合があります。次のようなことができます。
削除の場合、このようなものが機能する可能性があります。
INSERT INTO tableTemp SELECT * from table1 WHERE rowID != @targetRowID;
DROP table1;
INSERT INTO table1 SELECT * from tableTemp;
同様に、行を更新するには、まずこの方法で行を削除してから追加します。
最近の ClickHouse のリリースでは、データを更新または削除する機能が追加されましたが、その高価なバッチ操作はあまり頻繁に実行できません。
詳細については、 https://clickhouse.yandex/docs/en/query_language/alter/#mutationsを参照してください。