web-dev-qa-db-ja.com

Cassandra-主キー以外の欠点があるWHERE句

私はcassandraを初めて使用し、分析タスクに使用しています(適切なインデックス作成が必要です)。

私はこの投稿(および他の人)を読みました: cassandra、非主キーを介して選択WHERE clauseの非主キー列でDBにクエリを実行することはできません。

そうするために、3つの可能性があるようです(すべて大きな欠点があります):

  • セカンダリインデックスを作成します(パフォーマンスの問題にはお勧めしません)。
  • 新しいテーブルを作成します(cassandraで問題がない場合でも、冗長なデータは必要ありません)。
  • クエリする列を主キー内に配置します。この場合、WHERE句で主キーのすべての部分を定義する必要があり、INまたは=以外の演算子を使用できません。

上記の3つの制約がなくても、私がやろうとしていること(WHERE clause非主キー列)に他の方法はありますか?

11
farhawa

Cassandra自体の中から、上記で指定したオプションに制限されます。理由を知りたい場合は、こちらをご覧ください。

CQL Where句の詳細

ただし、Cassandra内に保存されている情報に対して分析を実行しようとしている場合は、Sparkの使用を検討しましたか?Sparkは、分散システムでの大規模なデータ処理用に構築されています。実際、SparkとCassandra)の間にいくつかの素晴らしい統合機能があるDatastax( ここ を参照)の使用を検討している場合データのロードと保存用。無料(コミュニティ)版と有料(エンタープライズ)版の両方があります。

6
bechbd

クエリでIFを使用してみてください。

UPDATE [keyspace_name.] table_name
[USING TTL time_value | USING TIMESTAMP timestamp_value]
SET assignment [, assignment] . . . 
WHERE row_specification
[IF EXISTS | IF condition [AND condition] . . .] ;

https://docs.datastax.com/en/archived/cql/3.3/cql/cql_reference/cqlUpdate.html を参照してください。

0
Matthew I.

cassandra 2.xバージョンを使用しているときに、同様の問題が発生しました。バージョンをcassandra 3.0以降にアップグレードしてください。これが私にとって唯一の解決策でした。

0
coder

クエリを実行するフィールドがパーティショニングキーの一部ではないことを考えると、テーブルは別の目的のために設計されていると思います。私の提案は、テーブルを複製し、クエリを実行するフィールドにキーを付けることです。 データモデリングの概念 に従って、使用する目的に合わせて新しいテーブルを設計することをお勧めします。

Cassandraには、CQLで実行できることに関して特定の制限を課すことにより、線形スケーリングなどのいくつかの利点があります。

0
Saket