Как запросить диапазон в Кассандре - PullRequest
0 голосов
/ 19 февраля 2020

Я пытаюсь запросить целое число в таблице Cassandra и получить ошибку Only EQ and IN relation are supported on the partition key(unless you use the token()function) Моя таблица настроена Ниже с запросом, который я выполнил. Имейте в виду, что я не настроил таблицу, и я не могу изменить ее в настоящее время.

CREATE TABLE USERS(
accName text,
accContext text,
accNumber int,
accCount int,
accHost text,
PRIMARY KEY (accName,accContext,accNumber)
);

SELECT * FROM Users WHERE accName = 'tear' and accContext = 'db1' 
   and accNumber> 20200101 and accNumber<= 202002018;

1 Ответ

2 голосов
/ 20 февраля 2020

Похоже, ваш запрос после редактирования:

SELECT * FROM Users
    WHERE accName = 'tear' and accContext = 'db1' 
    and accNumber> 20200101 and accNumber<= 202002018;

... отлично работает . Если вы укажете accName (ключ раздела) и accContext (1-й ключ кластеризации), вы абсолютно сможете выполнить запрос диапазона для целого числа, предполагая, что это следующая кластеризация next ключ. Однако, если вы удалите accContext из вашего запроса, это не получится, потому что вы не дадите Кассандре достаточно информации для эффективного извлечения нужных данных.

SELECT * FROM Users WHERE accNumber> 20200101 and accNumber<= 202002018;

Так что это был ваш запрос, прежде чем редактировать с рабочим решением. И, конечно же, вы видели ошибку, в которой говорится, что запросы диапазона для ключей секций работают только с функцией token.

Почему это так?

Возможно, вы слышал, что Cassandra требует «основанного на запросах» подхода к моделированию данных. Это потому, что все данные обычно не находятся на одном узле. Межузловые запросы дороги. Принудительный запрос диапазонов к ключам разделов с помощью token дает вам инструменты для ограничения вашего запроса узлом, который отвечает за указанный диапазон c токенов. В вашем случае это работает:

aaron@cqlsh:stackoverflow> SELECT token(accname),accname FROM Users
    WHERE token(accname) <= -6425313154088713591
      AND token(accname) >  -7367992452875979971;

 system.token(accname) | accname
-----------------------+---------
  -6611994791738996364 |    tear

(1 rows)

Деконструируя то, что я сделал здесь, используя функцию token в моем SELECT, я могу видеть, что такое токен строки "tear". Затем я могу запросить system.peers, чтобы узнать, какие узлы отвечают за этот токен, а также получить точные сведения о диапазонах токенов, за которые отвечают целевые узлы.

...