Clickhouseのドキュメントを見て、私はUPDATEとDELETEのオプションが表示されませんでした。それは私には付加システムだけのようです。 既存のレコードを更新する可能性はありますか?変更されたレコードを含むパーティションを切り捨て、そのパーティションのデータ全体を再インサートするなどの回避策がありますか?Clickhouseでデータを更新する
8
A
答えて
5
あなたが削除して新しいテーブルを作成するが、その大きさに応じて、これは非常に時間がかかるかもしれないことができます。削除のために、このような何かが仕事ができる
:あなたはこのような何かを行うことができます。
INSERT INTO tableTemp SELECT * from table1 WHERE rowID != @targetRowID;
DROP table1;
INSERT INTO table1 SELECT * from tableTemp;
同様に、行を更新するには、最初にこの方法で削除してから追加することができます。
9
ClickHouseは、DELETE/UPDATE本物をサポートしていません。 しかし、いくつかの回避策があります。
方法でデータを整理しようとは、それを更新する必要はないです。 更新イベントのログをテーブルに書き込み、そのログからレポートを計算することができます。したがって、既存のレコードを更新する代わりに、新しいレコードをテーブルに追加します。マージ中にバックグラウンドでデータ変換を行うテーブルエンジンを使用して
。たとえば、(むしろ特定の)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の答えを見てください。
関連する問題
- 1. Clickhouseのテーブルのカラム名を変更
- 2. ClickHouse JDBC
- 3. Clickhouseデータインポート
- 4. Clickhouseを新しいusers.xmlファイルにする方法は?
- 5. ClickHouseでユーザーアクセス権を制限する
- 6. ClickHouseでプライマリキーを作成する方法
- 7. ClickHouse、挿入時に値を変更する方法
- 8. 参照データ更新の埋め込みデータを更新する
- 9. バックグラウンドフェッチでURLSessionでデータを更新する
- 10. Clickhouse JDBCドライバクラス名
- 11. 列のデータを列の更新で更新する
- 12. ui-gridでデータを更新する
- 13. Microsoft.AspNet.WebApiでデータを更新する
- 14. フラッターでデータを更新する
- 15. recyclerviewでデータを更新する
- 16. Firebaseでデータを更新するには?
- 17. ファイアベースでデータを更新する方法
- 18. Graphqlでデータを更新するには
- 19. RustでMongoDBのデータを更新する
- 20. TitanDBでデータを更新する
- 21. localStorage.length()でデータを更新する方法
- 22. Vue.js - 親データをフィルタで更新する
- 23. テーブルjqueryでデータlinqを更新する
- 24. /更新データを
- 25. ClickHouseでプロセス(クエリ)を殺す方法
- 26. データを更新するためにスワイプしてデータを更新する
- 27. Symfony 3でデータを更新
- 28. Oracleビューでデータを更新
- 29. jqueryでデータ値を更新
- 30. DockerのClickhouseオプションexperimental_allow_extended_storage_definition_syntax
しかし、私は非常に大きなテーブルをどのように更新しますか?例えば、私のプロセスがたくさんのレコードを集めて、そのうち15%を「修正」すればどうでしょうか? – Jonathan
基本的に複数の行を更新して削除するだけですか?最初にこれらの行を一時表に選択し、where句を 'WHERE rowID is not in(SELECT rowID FROM targetTable')に変更することができます。ここでは選択できる項目によってのみ制限されます。 – samdoj
tableTempからINSERT INTO table1 SELECT *を実行する代わりに、テーブルの名前を変更する方がはるかに効率的です。 –