cassandra - 从 Cassandra 获取给定时间戳范围的记录

标签 cassandra

我正在使用 cassandra,我想获取给定时间戳范围之间的记录。这可能是什么查询?我正在使用 thrift 客户端。

我试过这段代码。

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 

如果我将 finishkey 设置为 null 然后它会说:

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)"

我不明白要将startkeyfinishkey 设置成什么值。 在上面的代码中:

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

这些是时间戳值。请建议我应该为开始和结束键取什么?

最佳答案

请使用Hector, a java client library for Cassandra或此处可用的其他客户之一:http://wiki.apache.org/cassandra/ClientOptions .使用原始的 Thrift 是缓慢、困难且充满陷阱的方法。

但是,一般来说,使用 RandomPartitioner 时您无法获得有意义的行范围,因为行是按其键的 MD5 散列排序的。相反,您需要通过使用时间戳或 TimeUUID 作为列名来在一行(或多行)内创建时间线。这将使您的列按时间顺序排序。然后,您可以将数据存储为列值,也可以将实际数据行的键存储为列值。

关于cassandra - 从 Cassandra 获取给定时间戳范围的记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4538123/

相关文章:

mysql - 具有全文搜索功能的海量数据库 - Sphinx、Lucene、Cassandra、MongoDB、CouchDB

java - cassandra - 高并发读写应用程序问题

cassandra - cassandra 是否保证写入期间的行级一致性?

database - 存储和解析文本日志和报告的理想系统

ubuntu - Cassandra 时间戳数据类型

cassandra - 试图登录到 cassandra 的控制台 (cqlsh) 并且它拒绝了我

java - DataStax Cassandra Exception : InvalidRequestException(why:there were 2 markers(? ) 在 CQL 中但有 3 个绑定(bind)变量

java - 在cassandra中按名字查找人

java - cassandra中的随机列获取

java - 我可以部分回放 Cassandra 提交日志吗?