2

以下は期待通りに動作しています。しかし、「年齢>40および年齢<50」のような範囲クエリを実行するのは誰ですか

create keyspace Keyspace1;
use Keyspace1;
create column family Users with comparator=UTF8Type and default_validation_class=UTF8Type and key_validation_class=UTF8Type;

set Users[jsmith][first] = 'John';
set Users[jsmith][last] = 'Smith';
set Users[jsmith][age] = long(42);

get Users[jsmith];
=> (column=age, value=42, timestamp=1341375850335000)
=> (column=first, value=John, timestamp=1341375827657000)
=> (column=last, value=Smith, timestamp=1341375838375000)
4

2 に答える 2

3

Cassandra でこれを行う最善の方法は要件によって異なりますが、これらの種類の範囲クエリをサポートするためのアプローチはかなり似ています。

基本的に、行内の列が名前でソートされるという事実を利用します。したがって、年齢を列名 (または列名の一部) として使用すると、行は年齢順に並べ替えられます。

これと時系列データの保存には多くの類似点があります。基本についてはBasic Time Series with Cassandraをご覧になることをお勧めします。最新の CQL 機能の紹介の後半では、より強力なアプローチの例を紹介しています。

組み込みセカンダリ インデックスは基本的にハッシュ テーブルのように設計されており、範囲式がインデックス付き列の等価式を伴わない限り、範囲クエリでは機能しません。そのため、 を要求できますがselect * from users where name = 'Joe' and age > 54、単にを要求することはできませんselect * from users where age > 54。これは、完全なテーブル スキャンが必要になるためです。詳細については、セカンダリ インデックスのドキュメントを参照してください。

于 2012-07-05T04:36:02.753 に答える
1

列の経過時間にセカンダリインデックスを作成する必要があります。

update column family Users with column_metadata=[{column_name: age, validation_class: LongType, index_type: KEYS}];

次に、以下を使用します。

get Users where age > 40 and age < 50 

注:私は思います:1.2以降、排他的演算子はサポートされていません。

Datastaxには、それに関する優れたドキュメントがあります。http ://www.datastax.com/dev/blog/whats-new-cassandra-07-secondary-indexesまたは、独自のセカンダリインデックスを作成して維持することもできます。これはそれについての良いリンクです: http ://www.anuff.com/2010/07/secondary-indexes-in-cassandra.html

于 2012-07-04T10:25:46.300 に答える