2016-06-18 6 views
8

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

答えて

5

あなたが削除して新しいテーブルを作成するが、その大きさに応じて、これは非常に時間がかかるかもしれないことができます。削除のために、このような何かが仕事ができる

:あなたはこのような何かを行うことができます。

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

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

+0

しかし、私は非常に大きなテーブルをどのように更新しますか?例えば、私のプロセスがたくさんのレコードを集めて、そのうち15%を「修正」すればどうでしょうか? – Jonathan

+1

基本的に複数の行を更新して削除するだけですか?最初にこれらの行を一時表に選択し、where句を 'WHERE rowID is not in(SELECT rowID FROM targetTable')に変更することができます。ここでは選択できる項目によってのみ制限されます。 – samdoj

+1

tableTempからINSERT INTO table1 SELECT *を実行する代わりに、テーブルの名前を変更する方がはるかに効率的です。 –

9

ClickHouseは、DELETE/UPDATE本物をサポートしていません。 しかし、いくつかの回避策があります。

方法でデータを整理しようと
  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の答えを見てください。

関連する問題