2011-01-12 5 views
6

時間範囲に関連付けられたデータを後で効率的に取得できるようにするための良い方法を探しています。時間範囲をcassandraに保存する

データの各エントリは、(start time, end time, value)と簡略化することができます。後で(x, y)の範囲内に入るすべてのエントリを取得する必要があります。 SQLでは、クエリが

SELECT value FROM data WHERE starttime <= x AND endtime >= y

ようなものになるだろうあなたは私には効率的なクエリを実行できるようになるカサンドラのデータの構造を提案することはできますか?

答えて

6

これは効率的にモデル化するのが非常に難しいことです。

私はCassandraのセカンダリインデックス(残念ながら現時点ではまだ必要なダミーのインデックス値)を使用することをお勧めします。少なくとも3つの列、 '開始'、 '終了'、および 'ダミー'でイベントごとに1つの行を使用する必要があります。これらのそれぞれにセカンダリインデックスを作成します。最初の2つはLongTypeで、最後の2つはBytesTypeです。詳細については、this post on using secondary indexesを参照してください。あなたがセカンダリインデックスクエリ(私が言及した不幸な要件)のための少なくとも1つの列でEQ式を使用する必要があるので、EQは常に「0」に設定できる「ダミー」になります。つまり、EQインデックス式本質的にノーオペレーションとなります)。残りのイベントデータは、開始、終了、およびダミーとともに行に格納できます。 pycassa

、Pythonのカサンドラクライアント、クエリは次のようになります。他のクライアントで似たような

from pycassa.index import * 
start_time = 12312312000 
end_time = 12312312300 
start_exp = create_index_expression('start', start_time, GT) 
end_exp = create_index_expression('end', end_time, LT) 
dummy_exp = create_index_expression('dummy', 0, EQ) 
clause = create_index_clause([start_exp, end_exp, dummy_exp], count=1000) 
for result in entries.get_indexed_slices(clause): 
    # do stuff with result 

があるはずです。

私が最初に考えた選択肢は、ほとんど常にバッドシングのOrderPreservingPartitionerでした。索引の場合は、開始時刻を行キーとして、終了時刻を列名として使用します。その後、start_key = start_timeおよびcolumn_finish = finish_timeで範囲スライスを実行できます。これにより、開始時刻以降のすべての行が検索され、finish_timeより前の列のもののみが返されます。非常に効率的ではなく、大規模なマルチゲットなどを行う必要があります。ノードはローカルデータのみを索引付けし、大部分の定型索引コードが処理されるため、組み込みセカンダリ索引アプローチが優れています。

関連する問題