Кассандра - CQL-запросы [COUNT, ORDER_BY, GROUP_BY] - PullRequest
0 голосов
/ 02 декабря 2018

Я новичок в Cassandra и пытаюсь узнать немного больше о том, как работает этот механизм БД (особенно часть CQL), и сравнить его с Mysql.

Имея это в виду, я пыталсянекоторый запрос, но есть один конкретный запрос, который я не могу понять.Из того, что я мог прочитать, видно, что выполнить этот запрос в Кассандре невозможно, но я хотел бы знать наверняка, есть ли какая-то работа вокруг этого.

Представьте себе следующую таблицу [Customer] с PRIMARY_KEY = id:

id, name, city, country, email 
01, Jhon, NY, USA, jhon@
02, Mary, DC, USA, mary@
03, Smith, L, UK, smith@
.....

Я хочу получить список, который показывает мне, сколько у меня клиентов на страну и ORDER BY DESC.

В mySQL это будет что-то вроде

SELECT COUNT(Id), country 
FROM customer
GROUP BY country
ORDER BY COUNT(Id) DESC

Но в Cassandra (CQL) кажется, что я не могу сделать GROUP BY столбцов, которые не являются PRIMARY_KEY (как в случае со "страной"), есть ли в любом случае это вокруг ???

Ответы [ 2 ]

0 голосов
/ 03 декабря 2018

Главное, что нужно помнить при создании таблицы в Кассандре, - это смоделировать ее ПЕРВИЧНЫЙ КЛЮЧ на основе того, как вы планируете его запрашивать.В любом случае, определение id в качестве ПЕРВИЧНОГО КЛЮЧА не очень полезно для того, что вы пытаетесь сделать.

Кроме того, для таких ключевых слов, как GROUP BY и ORDER BY, существуют особые требования.ORDER BY определенно довольно бесполезен (IMO), если вы не планируете изменить направление сортировки.Но вы не можете выбрать произвольный столбец для сортировки данных.

Для решения вышеупомянутого запроса я создам новую таблицу, основанную на столбцах country, city и id(в таком порядке):

CREATE TABLE customer_by_city (
  id TEXT,
  name TEXT,
  city TEXT,
  country TEXT,
  email TEXT,
  PRIMARY KEY (country,city,id)
) WITH CLUSTERING ORDER BY (city ASC, id DESC);

Теперь я вставлю строки:

INSERT INTO customer_by_city (id,name,city,country,email)
     VALUES ('01', 'Jhon', 'NY', 'USA', 'jhon@gmail.com');
INSERT INTO customer_by_city (id,name,city,country,email)
     VALUES ('02', 'Mary', 'DC', 'USA', 'mary@gmail.com');
INSERT INTO customer_by_city (id,name,city,country,email)
     VALUES ('03', 'Smith', 'London', 'UK', 'smith@gmail.com');

SELECT COUNT(Id), country  FROM customer_by_city  GROUP BY country ;

 system.count(id) | country
------------------+---------
                2 |     USA
                1 |      UK

(2 rows)

Warnings :
Aggregation query used without partition key

Примечания:

  • Последнее сообщение означает, что вы 'выполняется запрос без предложения WHERE с ключом раздела.Это означает, что Кассандре придется проверять каждый узел в кластере для обслуживания этого запроса. Очень неэффективно.
  • Хотя это работает для данного примера, country в качестве ключа раздела может быть не лучшим способом для распространения данных.В конце концов, если большинство клиентов находятся в одной конкретной стране, они потенциально могут раздвинуть границы максимального размера раздела.
0 голосов
/ 03 декабря 2018

Вам необходимо определить вторичный индекс для "страны".Вторичные индексы используются для запроса таблицы с использованием столбца, который обычно не является таблицей запросов.

Для ORDER BY вы определяете ключи кластеризации для 'id'. Ключи кластеризации отвечают за сортировку данных в разделе.

...