4

我有一个 Cassandra 列族,我每月存储大量(数十万)事件,时间戳(“Ymdhisu”)作为行键。它有多个列,为每个事件捕获一些数据。我尝试检索特定时间范围的事件数据。例如对于一月份,我使用了以下 CQL 查询:

a) 2013 年 1 月 1 日-1 月 15 日之间的查询

从测试中选择计数(*),其中 Key > 20130101070100000000 和 Key < 20130115070100000000 限制 100000;错误请求:开始键的 md5 排序在结束键的 md5 之后。这是不允许的;您可能根本不应该在 RandomPartitioner 下指定结束键

b) 2013 年 1 月 1 日-1 月 10 日范围内的查询

从测试中选择计数(*),其中 Key > 20130101070100000000 和 Key < 20130110070100000000 限制 100000;计数 - 73264

c) 2013 年 1 月 1 日至 2 月 2 日之间的查询

从测试中选择计数(*),其中 Key > 20130101070100000000 和 Key < 20130102070100000000 限制 100000;计数 - 78328

似乎范围搜索根本不起作用!我的 Columnfamily 的架构是:

Create column family Test with comparator=UTF8Type and default_validation_class=UTF8Type and key_validation_class=UTF8Type AND compression_options={sstable_compression:SnappyCompressor, chunk_length_kb:64};

要提取数据,有什么建议?我是否需要将密钥验证类重新定义为 TimeUUID 类型的架构?有没有其他方法可以在不更改架构的情况下有效地查询?我在这个列族中每月至少处理 100-200K 行数据。如果此模式不适用于此目的,那么存储和检索此处描述的数据类型的合适 Cassandra 模式是什么?

4

1 回答 1

5

您可以创建二级索引,例如“日期”和“月份”,并将每个事件的日期和月份与其他数据一起存储在这些列中。查询数据时,您可以获取指定月份或日期的所有行。

我不认为 Keys 上的范围查询会起作用。也许如果您将分区器从 RandomPartitioner 更改为 ByteOrderedPartitioner?

于 2013-01-18T21:41:16.323 回答