2016-11-02 9 views
0

非常に大きなCassandraのテーブルからの行の多くを削除し、D.区分化キーは、Aは、クラスタリング・キーはB、C、D4列A、B、CとIが表はFooを有する

Iでありますテーブル全体をスキャンし、Dがセットされているすべての行(X、Y、Z)を探したいとします。

これらの行を削除したいが、私はカサンドラを "殺す"(圧縮のために)、私はこれらの行を最小限の混乱やリスクで削除したいと思う。

どうすればいいですか?

+1

C * OSSの一部ではなく、直接的に削除戦略を削除するにはhttps://www.youtube.com/watch?v=BhGkSnBZgJAをチェックしてください。ただし、すべての読み取りを必要とせずに問題を解決できる場合があります。 https://github.com/protectwise/cassandra-util/tree/master/deleting-compaction-strategy –

答えて

2

ここに大きな問題があります。実際には、すべてのパーティションを実際にスキャンすることなく、実際に行を見つけることはできません。問題の本当の問題は、C *があなたのクエリをパーティションキーで制限してから、あなたのクラスタキーがあなたのPRIMARY KEYテーブル宣言に現れる順序で制限することができるということです。あなたのPKは、このようなものですのであれば:

PRIMARY KEY (A, B, C, D) 

あなたがのために、言われていること、次にBによって、C、およびD.だけ

によって終わりに、最初でフィルタする必要があるだろうの一部、これはあなたが

  1. すべてのあなたのテーブルをスキャンし、あなたのアプリケーションロジックにDの比較を行うことができ、あなたは一度だけ実行する必要が何かある場合は、あなたの行見つけます。
  2. Aの値がわかっている場合は、すべてのパーティションを並列にクエリし、次にアプリケーションでDを比較することができます。
  3. セカンダリインデックスを追加してそこからスピードを利用することができます。

あなたはこのようなタスクを複数回実行する必要がある場合、私はあなたをお勧めしたい

)本当にオプションではありませんどのように多くのノードあなたは3を持っているかに応じて、セカンダリインデックスはスケーリングしないことに注意してくださいPRIMARY KEY (D)のようなこのクエリを満たす別のテーブルを作成すると、3つのパーティションをスキャンするだけで非常に高速になります。

行を削除すると、圧縮をトリガーすることなくそれを行う方法はないと思います。これらはC *の一部であり、あなたはそれらと一緒に暮らす必要があります。あなたが本当に墓石の作成や圧縮を許さないのであれば、ではなくでC *クラスターから行を削除するしかありません。これはしばしば削除を必要としない新しいデータモデルを考えることを意味します。

+0

私はこれを何度も行う必要はありません。これは1回のクリーンアップの一部です。私は、別のテーブルを作成してそこにフィルタリングされたデータを移動し、元のテーブルを削除するほうが最適かもしれません。私は管理者から、「あまりにも多くの」墓石の作成が非常に問題であると聞いています。 –

+0

この場合、実行する必要のある*すべての*クエリを満たすのに適した複数のテーブルを作成して、状況を利用し、すべてのデータを非正規化*する必要があります。それは大きな勝利だろう。 – xmas79

関連する問題