我知道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
答案 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;