Кассандра: получить столбцы широкого ряда в обратном порядке с некоторой фильтрацией
Я понимаю, что Кассандра не поддерживает упорядочение по вторичным индексам, но я действительно не хочу упорядочивать по признакам. Все, что мне нужно, - это возможность получать столбцы в порядке возрастания или убывания, как они хранятся в семействе столбцов, поскольку 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');
и хотел бы получить "данные" в порядке убывания, когда статус соответствует 1. Поэтому я создал запрос, выберите * из at_data, где acct_bucket_id='1:1' и статус =1 порядок по ts desc;
и получил ошибку, Bad Request: ORDER BY со вторыми индексами не поддерживается.
Как мне этого добиться?
Спасибо, Шридхар
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;