Кассандра просит разрешить фильтр даже после упоминания всех ключей раздела в запросе? - PullRequest
1 голос
/ 07 апреля 2020

Я пытался смоделировать данные в Кассандре, и пытался отфильтровать данные на основе даты в том виде, в котором, согласно приведенному здесь ответу на SO, Здесь второй ответ не использует разрешающий фильтр .

Это моя текущая схема,

CREATE TABLE Banking.BankData(acctID TEXT, 
    email TEXT, 
    transactionDate Date , 
    transactionAmount double ,
    balance DOUBLE, 
    currentTime timestamp , 
    PRIMARY KEY((acctID, transactionDate), currentTime ) 
WITH CLUSTERING ORDER BY (currentTime DESC);

Теперь вставлены данные по

INSERT INTO banking.BankData(acctID, email, transactionDate, transactionAmount, balance, currentTime) values ('11', 'alpitanand20@gmail.com','2013-04-03',10010, 10010, toTimestamp(now()));

Теперь, когда я пытаюсь выполнить запрос, например

SELECT * FROM banking.BankData WHERE acctID = '11' AND transactionDate >  '2012-04-03';

Это говорит мне разрешить фильтрацию, однако в ссылке, упомянутой выше, это было не так. Последним требованием было получение данных по году, месяцу, неделе и т. Д., Поэтому потребовалось разделить их по дням, но запрос диапазона дат не работает. Любое предложение в реконструировать или я делаю что-то не так? Спасибо

1 Ответ

2 голосов
/ 07 апреля 2020

Cassandra поддерживает только предикат равенства в столбцах ключа раздела, поэтому вы можете использовать только = операцию с ним.

Предикаты диапазона (>, <, >=, <=) поддерживаются только в столбцах кластеризации, и это должен быть последний столбец условия кластеризации.

Например, если у вас есть следующий первичный ключ: (pk, c1, c2, c3), вы можете использовать предикат диапазона следующим образом:

  • where pk = xxxx and c1 > yyyy
  • where pk = xxxx and c1 = yyyy and c2 > zzzz
  • where pk = xxxx and c1 = yyyy and c2 = zzzz and c3 > wwww

, но вы не можете иметь:

  • where pk = xxxx and c2 > zzzz
  • where pk = xxxx and c3 > zzzz

потому что вам нужно ограничить предыдущие столбцы кластеризации перед использованием операции диапазона.

Если вы хотите выполнить запрос диапазона для этих данных, вам необходимо объявить соответствующий столбец как столбец кластеризации, например:

PRIMARY KEY(acctID, transactionDate, currentTime ) 

в этом случае вы можете выполнить свой запрос. Но поскольку у вас есть компонент времени, вы можете просто:

PRIMARY KEY(acctID, currentTime ) 

и выполнить запрос следующим образом:

SELECT * FROM banking.BankData WHERE acctID = '11' 
   AND currentTime >  '2012-04-03T00:00:00Z';

Но вам нужно принять во внимание две вещи:

  1. ваш основной должен быть уникальным - возможно, вам нужно будет добавить другой столбец кластеризации, например, идентификатор транзакции (например, типа uuid) - в этом случае даже 2 транзакции происходят в одну и ту же миллисекунду, они не будут перезаписывать друг друга;
  2. если у вас много транзакций на одну учетную запись, вам может понадобиться добавить еще один столбец в ключ раздела. Например, год или год / месяц, поэтому у вас нет больших разделов.

PS В связанном ответе возможно использование операции неравенства, поскольку ts является столбцом кластеризации.

...