13

Clickhouse のドキュメントを調べましたが、UPDATE または DELETE のオプションが表示されませんでした。私には追加のみのシステムのようです。既存のレコードを更新する可能性はありますか、または変更されたレコードを含むパーティションを切り捨て、そのパーティションのデータ全体を再挿入するなどの回避策はありますか?

4

5 に答える 5

17

更新: この答えはもはや真実ではありません。https://stackoverflow.com/a/55298764/3583139を見てください。

ClickHouse は実際の UPDATE/DELETE をサポートしていません。ただし、可能な回避策はほとんどありません。

  1. 更新する必要のない方法でデータを整理しようとしています。更新イベントのログをテーブルに書き込み、そのログからレポートを計算できます。したがって、既存のレコードを更新する代わりに、新しいレコードをテーブルに追加します。

  2. マージ中にバックグラウンドでデータ変換を行うテーブル エンジンを使用します。たとえば、(かなり具体的な) 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の答えも見てください。

于 2016-06-20T04:35:22.337 に答える
5

新しいテーブルを削除して作成することはできますが、サイズによっては非常に時間がかかる場合があります。次のようなことができます。

削除の場合、このようなものが機能する可能性があります。

  INSERT INTO tableTemp SELECT * from table1 WHERE  rowID != @targetRowID;
    DROP table1;
    INSERT INTO table1 SELECT * from tableTemp;

同様に、行を更新するには、まずこの方法で行を削除してから追加します。

于 2016-06-18T22:01:43.240 に答える
3

最近の ClickHouse のリリースでは、データを更新または削除する機能が追加されましたが、その高価なバッチ操作はあまり頻繁に実行できません。

詳細については、 https://clickhouse.yandex/docs/en/query_language/alter/#mutationsを参照してください。

于 2018-11-22T18:37:09.980 に答える