Кассандра выбирает отличное и заказывает cqlsh - PullRequest
0 голосов
/ 17 февраля 2019

Я новичок в Кассандре и на этом форуме.Я выполняю запрос Cassandra с использованием cqlsh, но я не знаю, как выполнить запрос типа sql select distinct a, b, c from table order by d asc с использованием Cassandra.Как я могу сделать?Какова будет структура таблицы?

1 Ответ

0 голосов
/ 17 февраля 2019

Ваш primary key состоит из partition keys и clustering columns.

  • Запросы DISTINCT должны запрашивать только ключи разделов.
  • ORDER BY поддерживается для кластеризованных столбцов.

Предположим, у нас есть пример таблицы, подобной следующей,

CREATE TABLE Sample ( 
 field1 text,
 field2 text,
 field3 text,
 field4 text,
 PRIMARY KEY ((field1, field2), field3));

DISTINCT требует, чтобы все ключи разделения передавались через запятую.

Так что вы не можете запустить этозапрос select distinct field1 from Sample;.Допустимое выражение: select distinct field1, field2 from Sample;.

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

По умолчанию записи будут в порядке возрастания для field3.Приведенный ниже запрос предоставит записи в порядке убывания поля 3.

select * from Sample where field1 = 'a' and field2 = 'b' order by field3 desc;

Если вы уже знаете шаблоны запросов и то, как вам требуется упорядочивать данные, вы можете создать таблицу таким образом.Предположим, что вы всегда запрашиваете записи в порядке убывания для field3, вы могли бы спроектировать свою таблицу таким образом.

CREATE TABLE Sample ( 
 field1 text,
 field2 text,
 field3 text,
 field4 text,
 PRIMARY KEY ((field1, field2), field3))
WITH CLUSTERING ORDER BY (field3 DESC);

Теперь запрос без заказа по приведет к тому же результату.

Вы можетеиспользовать порядок с несколькими кластеризованными столбцами.Но вы не можете пропустить заказ.Чтобы понять, что у нас есть пример таблицы, как показано ниже,

CREATE TABLE Sample1 ( 
 field1 text,
 field2 text,
 field3 text,
 field4 int,
 field5 int,
 PRIMARY KEY ((field1, field2), field3, field4));

Я добавил несколько фиктивных записей.enter image description here

Вы можете использовать порядок по нескольким столбцам, как этот select * from Sample1 where field1 = 'a' and field2 = 'b' order by field3 desc, field4 desc;

ПРИМЕЧАНИЕ. Все поля должны быть либо в положительном порядке (field3 asc, field4 asc), либоотрицательный порядок (field3 desc, field4 desc).Вы не можете сделать (field3 asc, field4 desc) или наоборот.

Выше запрос приведет к этому.enter image description here

Написав, мы не можем пропустить заказ по порядку, я имел в виду, что мы не можем сделать что-то вроде select * from Sample1 where field1 = 'a' and field2 = 'b' order by field4 desc;

Надеюсь, это поможет!

...