4

We are trying to create/query information from a CF based on the following structure (e.g. a datetime, datetime, integer)

e.g.
03-22-2012 10.00, 03-22-2012 10.30 100
03-22-2012 10.30, 03-22-2012 11.00 50
03-22-2012 11.00, 03-22-2012 11.30 200

How do I model the above structure in Cassandra and perform the following queries via Hector.

select * from <CF> where datetime1 > 03-22-2012 10.00 and datetime2 < 03-22-2012 10.30
select * from <CF> where datetime1 > 03-22-2012 10.00 and datetime2 < 03-22-2012 11.00
select * from <CF> where datetime = 03-22-2012 (i.e. for the entire day)
4

2 に答える 2

2

これは、Cassandraで日付と時刻を操作するための優れた入門書です:Cassandraを使用した基本的な時系列

つまり、列名としてタイムスタンプ(またはv1 UUID)を使用し、コンパレータをLongType(またはTimeUUIDType)に設定して、列を時系列で並べ替えます。そうすれば、2つの時点の間のデータのスライスを簡単に取得できます。

あなたの質問はこれについて完全に明確ではありませんが、日付に関係なく特定の時間帯に発生したすべてのイベントを取得したい場合は、データを別の方法で構造化する必要があります。この場合、列名はCompositeType(LongType、AsciiType)であり、最初のコンポーネントは通常のタイムスタンプmod 86400(1日の秒数)であり、2番目のコンポーネントは日付などの時間とともに変化するものです。完全なタイムスタンプのように。また、この場合は行を分割して、1時間ごとに異なる行を割り当てることもできます。

于 2012-03-22T05:16:10.907 に答える
0

残念ながら、Cassandraの1つの列ファミリーだけでこれを簡単に行う方法はありません。問題は、カサンドラがdatetime1とdatetime2の2つの異なるものに基づいてソートすることを望んでいることです。

このための明らかな構造は、列を複合型の複合(TimeUUID、TimeUUID、整数)にすることです。この場合、それらはdatetime1、datetime2、integerの順にソートされます。

ただし、datetime2ではなくdatetime1に基づいて常に順序付けが行われます(ただし、2つのエントリが同じdatetime1を持っている場合は、datetime2に基づいてそれらのエントリのみが順序付けられます)。

考えられる回避策は、重複データを持つ2つの列ファミリー(または実際には論理行ごとに2つの行)を持つことです。データが挿入される1つの行(datetime1:datetime2:integer)とデータが挿入されるもう1つの行(datetime2:datetime1:integer)。次に、これら2つの行に対してマルチゲットスライス操作を実行し、データを結合してから呼び出し元に渡すことができます。

final MultigetSliceQuery<String, Composite, String> query = HFactory.createMultigetSliceQuery(keyspace,
    StringSerializer.get(),
    CompositeSerializer.get(),
    StringSerializer.get());

query.setColumnFamily("myColumnFamily");
startQuery.setKeys("myRow.arrangedByDateTime1", "myRow.arrangedByDateTime2");
startQuery.setRange(new Composite(startTime), new Composite(endTime), false, Integer.MAX_VALUE);

final QueryResult<Rows<String,Composite,String>> queryResult = query.execute();
final Rows<String,Composite,String> rows = queryResult.get();
于 2012-03-22T15:26:57.427 に答える