4

次のような SQL クエリと同様に、Cassandra で列ファミリーを部分的に検索しようとしています。

SELECT 関数に関するdatastax のドキュメントを読みましたが、部分的な WHERE 基準のサポートが見つからないようです。何か案は?

4

1 に答える 1

10

Cassandra では、このようなワイルドカードのサポートはありませんが、同じ最終結果が得られるようにデータをモデル化できます。

このクエリを実行する列を取得し、それを 2 番目の列ファミリーに非正規化します。colこの CFには、ワイルド カード クエリを実行する値として列名を持つ単一の幅の行があります。この CF の列値は、元の CF の行キーまたは元の行のその他の表現のいずれかです。

次に、スライスを使用して、関心のある値を取得します。たとえば、これがスライスする幅の広い行である場合:

 +---------+----------+--------+----------+---------+--------+----------+
 |  RowKey | aardvark | abacus | abacuses | abandon | accent | accident |
 |         +----------+--------+----------+---------+--------+----------+
 |         |          |        |          |         |        |          |
 |         |          |        |          |         |        |          |
 +---------+----------+-----------------------------+--------+----------+

CQL を使用すると、次のクエリを使用して「aba*」で始まるすべてを選択できます*:

  SELECT 'aba'..'abb' from some_cf where RowKey = some_row_key;

これにより、「そろばん」、「そろばん」、および「放棄」の列が得られます。

この戦略には、次の点に注意してください。

  • 上記の例では、同じ column_name を持つものがある場合、それらを区別する何らかの方法が必要です (そうしないと、幅の広い列ファミリに挿入すると、他の有効な値が上書きされます)。wordこれを行う 1 つの方法は、 :の複合列を使用することですsome_unique_value
  • 上記のモデルでは、文字列の末尾でのみワイルド カードを使用できます。文字列の先頭にあるワイルドカードも、いくつかの変更で簡単に処理できます。文字列の途中にワイルド カードを使用すると、はるかに困難になります。

Cassandra では、アドホック クエリを実行する簡単な方法が提供されないことに注意してください。代わりに、データをどのように使用するかを理解し、それに応じて CF をモデル化する必要があります。このようなデータのモデリングの詳細については、Cassandra でのデータのインデックス作成に関するEd Anuff のブログ投稿をご覧ください。

*列をスライスするための CQL 構文は、Cassandra の今後のリリースで変更されることに注意してください。

于 2012-04-07T16:56:18.043 に答える