【问题标题】:Fetching Records withing given range of timestamp from cassandra从 cassandra 获取具有给定时间戳范围的记录
【发布时间】:2017-02-13 21:05:27
【问题描述】:

我正在使用 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"; 

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

【问题讨论】:

  • 你用的是什么客户端?这些信息将使这个问题变得更有用。

标签: cassandra


【解决方案1】:

请使用Hector, a java client library for Cassandra 或此处提供的其他客户端之一:http://wiki.apache.org/cassandra/ClientOptions。使用原始 Thrift 很慢、很困难,而且很麻烦。

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

【讨论】:

    【解决方案2】:

    【讨论】:

    • 或者当它是单行时甚至只是 get_slice()。
    【解决方案3】:

    时间戳用于解决给定列的冲突。他们不在那里进行搜索。如果您想按时间戳进行搜索,您应该将时间戳放入您的数据模型中(在键、列名或列值中)。

    【讨论】:

      【解决方案4】:

      您可以使用时间戳作为列名,以利用 Cassandra 自动完成的列名排序。接下来出现的问题与行大小有关。您可能无法将所有时间序列数据存储在一行中。您的数据可能需要分成几行。

      根据生成的数据量,您可以选择不同的选项。您可能决定将每天的数据存储在单独的行中,并且将数据存储在我提到的按列名排序的行中。在这种情况下,如果您的查询中的时间范围跨越天边界,您将不得不为每一行(即您的时间跨度范围内的天)进行多个查询。本质上,原始范围查询将转换为多个范围查询。

      【讨论】:

        猜你喜欢
        • 2013-09-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-07-17
        • 2023-03-25
        • 1970-01-01
        • 2011-05-15
        • 1970-01-01
        相关资源
        最近更新 更多