ЗАКАЗАТЬ ПО перезагрузке, кассандра

Данное семейство столбцов я хотел бы отсортировать, и для этого я пытаюсь создать таблицу с опцией CLUSTERING ORDER BY. Я всегда сталкиваюсь со следующими ошибками:

1.) Вариант A, приводящий к выражению неверный запрос: отсутствует ПОРЯДОК КЛАСТЕРИЗАЦИИ для идентификатора пользователя столбца:

CREATE TABLE test.user (
  userID timeuuid,
  firstname varchar,
  lastname varchar,
  PRIMARY KEY (lastname, userID)
)WITH CLUSTERING ORDER BY (lastname desc);

2.) Вариант B, приводящий к неверному запросу: в директиве CLUSTERING ORDER могут быть определены только столбцы ключей кластеризации:

CREATE TABLE test.user (
  userID timeuuid,
  firstname varchar,
  lastname varchar,
  PRIMARY KEY (lastname, userID)
)WITH CLUSTERING ORDER BY (lastname desc, userID asc);

Насколько я могу видеть в руководстве, это правильный синтаксис для создания таблицы, для которой я хотел бы запускать запросы как «ВЫБРАТЬ .... ОТ пользователя WHERE ... ORDER BY lastname». Как мне этого добиться? (Столбец "lastname" я хотел бы сохранить в качестве первой части первичного ключа, чтобы я мог использовать его в операторах удаления с предложением WHERE.)

Большое спасибо, Тамас


person Tamas    schedule 26.02.2015    source источник


Ответы (2)


В вашем случае кластеризация будет ограничена тем, что определено в ключе разделения (lastName + userId). Таким образом, cassandra сохранит результат в отсортированном порядке, чья комбинация (lastName + userId). Вот почему нельзя давать и то, и другое для поиска. Это все еще бесполезная схема, если вы хотите отсортировать все данные в таблице по фамилии, поскольку userId уникален (timeuuid), поэтому ключ кластеризации будет бесполезен.

CREATE TABLE test.user (
  userID timeuuid,
  firstname varchar,
  lastname varchar,
  bucket int,
  PRIMARY KEY (bucket)
)WITH CLUSTERING ORDER BY (lastname desc);

Здесь, если вы укажете значение корзины, скажем, 1 для всех пользовательских записей, тогда все пользователи войдут в одну и ту же корзину, и, следовательно, он будет извлекать все строки в отсортированном порядке по фамилии. (Ни в коем случае это хороший дизайн, просто чтобы дать вам представление).

Пересмотрено:

CREATE TABLE user1 (
  userID uuid,
  firstname varchar,
  lastname varchar,
  bucket int,
  PRIMARY KEY ((bucket), lastname,userID)
)WITH CLUSTERING ORDER BY (lastname desc);
person turbo    schedule 26.02.2015
comment
Ваше утверждение о порядке кластеризации неверно. Ключ разделения не имеет ничего общего с порядком сортировки на диске. Ключи кластеризации влияют на порядок сортировки. Хешированное значение ключа разделения определяет размещение в кластере. Кроме того, ваш оператор CREATE TABLE завершится ошибкой с фиктивным параметром Неизвестное определение, указанным в ПЕРВИЧНОМ КЛЮЧЕ. - person Aaron; 27.02.2015
comment
@ BryceAtNetwork23 я хотел bucket как pk, исправил. Например, если мы дадим pk в качестве идентификатора пользователя (который будет отличаться для каждого нового пользователя), то ключ кластеризации будет работать только для строк в одном разделе, так как в разделе есть одна запись из-за timeuuid, сортировка будет по одной записи, а не через стол. - person turbo; 27.02.2015
comment
Вы попадаете туда ... теперь это не удастся. В директиве CLUSTERING ORDER можно определить только ключевые столбцы кластеризации. - person Aaron; 27.02.2015
comment
измененная схема будет возвращать отсортированный результат на основе фамилии, если у всех пользователей значение корзины равно 1. - person turbo; 27.02.2015

Вы можете указать только порядок кластеризации для ключей кластеризации.

PRIMARY KEY (lastname, userID)
)WITH CLUSTERING ORDER BY (lastname desc);

В вашем первом примере ваш единственный ключ кластеризации - userID. Таким образом, это единственная допустимая запись для CLUSTERING ORDER BY.

PRIMARY KEY (lastname, userID)
)WITH CLUSTERING ORDER BY (lastname desc, userID asc);

Второй пример не работает, потому что вы указываете ключ раздела в CLUSTERING ORDER BY, и это тоже не сработает.

Cassandra работает, упорядочивая строки CQL в соответствии с ключами кластеризации, но только когда указан ключ раздела. Это связано с тем, что вся идея моделирования широких строк Cassandra заключается в запросе по ключу раздела и чтении ряда упорядоченных строк за одну операцию запроса.

Я хотел бы выполнять запросы как «ВЫБРАТЬ .... ОТ пользователя ГДЕ ... ЗАКАЗАТЬ ПО фамилии».

Учитывая это утверждение, я собираюсь предположить, что вам понадобится еще один столбец в этой модели, прежде чем она будет работать так, как вы хотите. Вам нужен соответствующий ключ раздела для вашего users стол. Скажите ... как group. Если ваши пользователи разделены по group и сгруппированы по lastname, ваше определение будет выглядеть примерно так:

CREATE TABLE test.usersbygroup (
  userID timeuuid,
  firstname varchar,
  lastname varchar,
  group text,
  PRIMARY KEY (group,lastname)
)WITH CLUSTERING ORDER BY (lastname desc);

Затем этот запрос будет работать, возвращая пользователей (в данном случае), которые являются поклонниками шоу "Firefly", отсортированные по lastname (по убыванию):

SELECT * FROM usersbygroup WHERE group='Firefly Fans';

Прочтите этот документ DataStax о составных ключах и кластеризации, чтобы лучше понять.

ПРИМЕЧАНИЕ. Вам не нужно указывать ORDER BY в вашем SELECT. Строки будут возвращены в порядке их ключа (ключей) кластеризации, и ORDER BY не может это изменить. Все, что ORDER BY действительно может сделать, - это изменить направление сортировки (DESCending против ASCending).

person Aaron    schedule 26.02.2015