cassandra:通过一些过滤以相反的顺序获取宽行的列

时间:2013-10-21 15:49:11

标签: cassandra time-series cql3 cqlsh

我知道cassandra不支持使用二级索引的顺序,但我真的不希望按功能排序。所有我想要的是能够以列系列中存储的升序或降序排列列,因为cassandra已对列名进行排序。

我想将cassandra中的时间序列数据建模为宽行。我需要按升序或降序访问这些数据。我还想创建几个二级索引来执行选择查询。所以我的专栏系列at_data看起来像是,

create table at_data (acct_bucket_id text,
             ... ts varint,
             ... status int,
             ... side int,
             ... instrument_id varint,
             ... data text,
             ... PRIMARY KEY (acct_bucket_id, ts, status, side, instrument_id)
             ... ) with comment = 'audit data';

如果我向此列族添加数据。

insert into at_data (acct_bucket_id, ts, status, side, instrument_id, data) values ('1:1', 1, 1, 1, 1, 'order 1');
insert into at_data (acct_bucket_id, ts, status, side, instrument_id, data) values ('1:1', 2, 1, 1, 1, 'order 2');
insert into at_data (acct_bucket_id, ts, status, side, instrument_id, data) values ('1:1', 3, 2, 1, 1, 'order 3');

并希望以状态匹配的降序顺序获取'数据'。所以我创建了查询, select * from at_data,其中acct_bucket_id ='1:1',status = 1 order by ts desc;

并得到错误, 错误请求:不支持带有第二个索引的ORDER BY。

我如何实现这一目标?

谢谢, Shridhar

1 个答案:

答案 0 :(得分:1)

您可以执行select * from at_data where acct_bucket_id = '1:1' and ts = 1 and status = 1 order by ts desc;您无法在查询中跳过ts,因为它在主键中位于status之前。并且您不能按status订购,因为order by只接受主键的第二个键。

您可以将主键更改为PRIMARY_KEY (acct_bucket_id, status, ts, side, instrument_id) - 将status置于ts之前。在这种情况下,您可以执行select * from at_data where acct_bucket_id='1:1' and status = 1 order by status desc;