Кассандра композитный указатель и компактные хранилища

Я новичок в Кассандре, еще не запускал, но моя бизнес-логика требует создания такой таблицы.

CREATE TABLE Index( 
  user_id uuid, 
  keyword text, 
  score text, 
  fID int, 
  PRIMARY KEY (user_id, keyword, score); ) 
WITH CLUSTERING ORDER BY (score DESC) and COMPACT STORAGE;

Это возможно или нет? У меня есть только один столбец (fID), который не является частью моего составного индекса, поэтому я надеюсь, что смогу применить параметр compact_storage. Обратите внимание, что я заказал по третьему столбцу моего составного индекса, а не по второму. Мне также нужно сжать хранилище, чтобы ключевые слова не повторялись для каждого FID.

1 ответ

Несколько вещей изначально о вашем CREATE TABLE заявление:

  1. Это будет ошибка на точку с запятой (;) после вашего первичного определения ключа.
  2. Вам нужно будет выбрать новое имя, так как Index это зарезервированное слово.

Обратите внимание, что я заказал по третьему столбцу моего составного индекса, а не по второму.

  1. Вы не можете пропустить ключ кластеризации при указании CLUSTERING ORDER,

Тем не менее, я вижу вариант здесь. В зависимости от требований вашего запроса, вы можете просто изменить порядок keyword а также score в вашем определении первичного ключа, и тогда это будет работать:

CREATE TABLE giveMeABetterName(
  user_id uuid, 
  keyword text, 
  score text, 
  fID int, 
  PRIMARY KEY (user_id, score, keyword)
) WITH CLUSTERING ORDER BY (score DESC) and COMPACT STORAGE;

Таким образом, вы можете запросить user_id и ваши строки (ключевые слова?) для этого пользователя будут упорядочены score:

SELECT * FROM giveMeABetterName WHERE `user_id`=1b325b66-8ae5-4a2e-a33d-ee9b5ad464b4;

Если это не сработает для вашей бизнес-логики, возможно, вам придется ретушировать модель данных. Но невозможно пропустить ключ кластеризации при указании CLUSTERING ORDER,

редактировать

Но переупорядочение столбцов у меня не работает. Могу ли я сделать что-то подобное WITH CLUSTERING ORDER BY (keyword asc, score desc)

Давайте посмотрим на некоторые варианты здесь. Я создал таблицу с вашим оригинальным ПЕРВИЧНЫМ КЛЮЧОМ, но с этим КЛАСТЕРНЫМ ЗАКАЗОМ. Технически это будет работать, но посмотрим, как это относится к моим образцам данных (ключевые слова видеоигр):

aploetz@cqlsh:stackru> SELECT * FROM givemeabettername WHERE user_id=dbeddd12-40c9-4f84-8c41-162dfb93a69f;
 user_id                              | keyword          | score | fid
--------------------------------------+------------------+-------+-----
 dbeddd12-40c9-4f84-8c41-162dfb93a69f | Assassin's creed |    87 |   0
 dbeddd12-40c9-4f84-8c41-162dfb93a69f |    Battlefield 4 |     9 |   0
 dbeddd12-40c9-4f84-8c41-162dfb93a69f |      Uncharted 2 |    91 |   0

(3 rows)

С другой стороны, если я изменю ПЕРВИЧНЫЙ КЛЮЧ на кластер на score сначала (и соответственно измените CLUSTERING ORDER), тот же запрос возвращает это:

 user_id                              | score | keyword          | fid
--------------------------------------+-------+------------------+-----
 dbeddd12-40c9-4f84-8c41-162dfb93a69f |    91 |      Uncharted 2 |   0
 dbeddd12-40c9-4f84-8c41-162dfb93a69f |    87 | Assassin's creed |   0
 dbeddd12-40c9-4f84-8c41-162dfb93a69f |     9 |    Battlefield 4 |   0

Обратите внимание, что вы хотите изменить тип данных score от TEXT к числовому (int/bigint), чтобы избежать ASCII-бетической сортировки, например так:

 user_id                              | score | keyword          | fid
--------------------------------------+-------+------------------+-----
 dbeddd12-40c9-4f84-8c41-162dfb93a69f |    91 |      Uncharted 2 |   0
 dbeddd12-40c9-4f84-8c41-162dfb93a69f |     9 |    Battlefield 4 |   0
 dbeddd12-40c9-4f84-8c41-162dfb93a69f |    87 | Assassin's creed |   0

Что-то, что может вам помочь, это прочитать этот документ DataStax по составным ключам и кластеризации.

Другие вопросы по тегам