2010-12-27 14 views
2

私はcassandraを使用しています。タイムスタンプの指定された範囲の間にあるレコードを取得したいと思います。これに対する質問は何でしょうか?私は倹約クライアントを使用しています。cassandraからタイムスタンプの指定された範囲でレコードを取得する

私はこのコードを試しました。

String columnFamily = "UserColumnFamily"; 
String keyspace="Enterprise"; 
final String UTF8 = "UTF8"; 
String keyUserid="1"; 
TTransport tr = new TSocket("10.10.10.104", 9160); 
TProtocol proto = new TBinaryProtocol(tr); 
Cassandra.Client client = new Cassandra.Client(proto); 
SlicePredicate predicate = new SlicePredicate(); 
    SliceRange sliceRange = new SliceRange(); 
String startkey="1293443184521000"; 
String finishkey ="1293445102333000";   
sliceRange.setStart(new byte[0]); 
     sliceRange.setFinish(new byte[0]); 
predicate.setSlice_range(sliceRange); 
     ColumnParent parent = new ColumnParent(columnFamily); 
     try { 
    tr.open(); 
    List<KeySlice> results=client.get_range_slice(keyspace,parent,predicate,startkey,finishkey,100, ConsistencyLevel.ONE); 
     for (KeySlice result : results) { 
      Column column = (Column) result.columns; 
      System.out.println(new String(column.name,UTF8) + " ->> " 
      + new String(column.value,UTF8)); 
     } 
     tr.close(); 
} catch (Exception e) { 
    // TODO Auto-generated catch block 
    e.printStackTrace(); 
} 

しかし、それは、このエラーがスローされます。

InvalidRequestException(why:start key's md5 sorts after end key's md5. 
This is not allowed; you probably should not specify end key at all, under RandomPartitioner 

を私はnullfinishkeyを置けば、それは言う:

Required field 'finish_key' was not present! 
    Struct: get_range_slice_args(keyspace:NiidleEnterprise, 
    column_parent:ColumnParent(column_family:UserColumnFamily), 
    predicate:SlicePredicate(slice_range:SliceRange(start:, finish:, reversed:false, count:100)), 
    start_key:1293443184521000, finish_key:null, row_count:100, consistency_level:ONE)" 

私はstartkeyとして設定する値を理解していませんおよびfinishkey。 上記のコード内:

String startkey="1293443184521000"; 
String finishkey ="1293445102333000"; 

これらはタイムスタンプ値です。開始キーと終了キーのために何をすべきか教えてください。

+0

あなたはどのクライアントを使用していますか?その情報はこれをはるかに有用な質問にするでしょう。 –

答えて

5

Hector, a java client library for Cassandraまたはここに利用可能な他のクライアントのいずれかを使用してください。生の倹約を使うことは、遅く、難しく、つかまえて行く方法です。

しかし、RandomPartitionerを使用している場合、行の意味のある範囲を取得することはできません。なぜなら、行はキーのMD5ハッシュによって順序付けされるからです。代わりに、列名にタイムスタンプまたはTimeUUIDを使用して、行(または複数の行)内にタイムラインを作成する必要があります。これにより、列が時系列でソートされます。次に、データを列の値として格納するか、実際のデータ行のキーを列の値として格納することができます。

2

タイムスタンプは、指定された列の競合解決に使用されます。彼らは検索のためにそこにいません。タイムスタンプで検索する場合は、タイムスタンプをデータ・モデル(キー、列名、または列値)に入れる必要があります。

0

Cassandraによって自動的に行われた列名の並べ替えを利用するために、列名としてタイムスタンプを使用できます。次の質問は、行サイズに関連しています。すべての時系列データを1つの行に格納することはできません。あなたのデータは、いくつかの行に沿って分解される必要があります。

生成されるデータの量に応じて、さまざまなオプションを選択できます。上記のように、毎日のデータを別々の行に格納し、行のデータを列名でソートすることもできます。この場合、クエリの時間範囲が曜日境界にまたがっている場合は、各行(つまり、期間の範囲の1日)ごとに複数のクエリを実行する必要があります。基本的に、元の範囲クエリは複数の範囲クエリに変換されます。

関連する問題